2011-01-29 4 views
21

자동 팩스는 Func<T>에 대한 공장을 자동으로 생성합니다. 매개 변수를 전달할 수도 있습니다.Ninject는 Func (자동 생성 된 팩토리)를 지원합니까?

public class MyClass 
{ 
    public MyClass(Func<A> a, Func<int, B> b) 
    { 
     var _a = a(); 
     var _b = b(1); 
    } 
} 

Ninject에서도 동일한 작업을 수행 할 수 있습니까? 그렇지 않은 경우 적용 할 수있는 해결 방법은 무엇입니까?

감사합니다.

업데이트 :

How do I handle classes with static methods with Ninject?

답변

29

NB Ninject에 3.0 이상이 완전히 위키를 참조 Ninject.Extensions.Factory 패키지를 사용하여 지원이 있습니다

그냥,이 게시물을 발견 대답은 '노 보인다 : - https://github.com/ninject/ninject.extensions.factory/wiki


편집 : NB는 0이 Ninject 2.3의구현 (완전 테스트 지원 릴리스는 아니지만 is available from the CodeBetter server)

Ninject는이 시점에서이 기능을 기본적으로 지원하지 않습니다. 우리는 이것을 다음 버전에 추가 할 계획이었습니다. 그러나 적절한 바인딩을 구성하여 지원을 쉽게 추가 할 수 있습니다. 아래의 모듈을로드하고 즐기십시오.

public class FuncModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Kernel.Bind(typeof(Func<>)).ToMethod(CreateFunc).When(VerifyFactoryFunction); 
    } 

    private static bool VerifyFactoryFunction(IRequest request) 
    { 
     var genericArguments = request.Service.GetGenericArguments(); 
     if (genericArguments.Count() != 1) 
     { 
      return false; 
     } 

     var instanceType = genericArguments.Single(); 
     return request.ParentContext.Kernel.CanResolve(new Request(genericArguments[0], null, new IParameter[0], null, false, true)) || 
       TypeIsSelfBindable(instanceType); 
    } 

    private static object CreateFunc(IContext ctx) 
    { 
     var functionFactoryType = typeof(FunctionFactory<>).MakeGenericType(ctx.GenericArguments); 
     var ctor = functionFactoryType.GetConstructors().Single(); 
     var functionFactory = ctor.Invoke(new object[] { ctx.Kernel }); 
     return functionFactoryType.GetMethod("Create").Invoke(functionFactory, new object[0]); 
    } 

    private static bool TypeIsSelfBindable(Type service) 
    { 
     return !service.IsInterface 
       && !service.IsAbstract 
       && !service.IsValueType 
       && service != typeof(string) 
       && !service.ContainsGenericParameters; 
    } 

    public class FunctionFactory<T> 
    { 
     private readonly IKernel kernel; 

     public FunctionFactory(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public Func<T> Create() 
     { 
      return() => this.kernel.Get<T>(); 
     } 
    } 
} 
+0

코드를 제공해 주셔서 감사합니다. 다음 버전을 기대합니다. –

+0

모든 노력에 감사드립니다. Remo. Func >에서 작동하도록 코드를 확장 할 수 있습니까? – Anders

+0

그렇습니다. FunctionFactory.Create 메서드를 변경하고 IEnumerable을 확인한 다음 GetAll을 반환하십시오. –

관련 문제