ninject autofac func

¿Ninject es compatible con Func(fábrica generada automáticamente)?



autofac (1)

NB Ninject 3.0 y posteriores tienen esto totalmente compatible con el paquete Ninject.Extensions.Factory , consulte la wiki: - https://github.com/ninject/ninject.extensions.factory/wiki

EDITAR: NB hay una implementación de Bind<T>().ToFactory() en Ninject 2.3 (que no es una versión totalmente compatible, pero está disponible desde el servidor CodeBetter )

Ninject no es compatible con esto de forma nativa en este momento. Planeamos agregar esto a la próxima versión. Pero el soporte se puede agregar fácilmente configurando el enlace apropiado. Solo carga el módulo a continuación y disfruta.

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>(); } } }

Autofac genera automáticamente fábricas para Func<T> ; Incluso puedo pasar parámetros.

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

¿Puedo hacer lo mismo con Ninject? Si no, ¿qué solución puedo aplicar?

Gracias.

Actualización :

Acabo de encontrar esta publicación, parece que la respuesta es no:

¿Cómo manejo las clases con métodos estáticos con Ninject?