2011-01-29 14 views

cevap

29

NB Ninject 3.0 ve daha sonra bu tamamen wiki'yi bkz Ninject.Extensions.Factory paketini kullanarak desteklenen vardır:

Sadece bu yazı bulundu cevap hayır görünüyor: - https://github.com/ninject/ninject.extensions.factory/wiki


DÜZENLEME: NB bir 0 var (Tam olarak desteklenen bir testleri salma ancak is available from the CodeBetter server değildir) Ninject 2.uygulama

Ninject şu anda doğal olarak bu desteklemez. Bunu bir sonraki sürüme eklemeyi planladık. Ancak, uygun bağlamayı yapılandırarak destek kolayca eklenebilir. Sadece aşağıdaki modülü yükleyin ve keyfini çıkarın.

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

Kod için teşekkürler! Bir sonraki versiyon için sabırsızlıkla beklerim. –

+0

Tüm sıkı çalışmanız için teşekkürler Remo. Func > ile çalışmak için kodu genişletmek mümkün mü? – Anders

+0

Elbette öyle. FunctionFactory.Create yöntemini değiştirin, IEnumerable için işaretleyin ve GetAll yerine döndürün. –