NB Ninject 3.0 i później ma to w pełni obsługiwany przy użyciu pakietu Ninject.Extensions.Factory
, zobacz wiki: - https://github.com/ninject/ninject.extensions.factory/wiki
EDYCJA: UWAGA: Bind<T>().ToFactory()
implementacja w wersji 2.3 (która nie jest w pełni przetestowanym obsługiwanym wydaniem, ale is available from the CodeBetter server)
Ninject obecnie nie obsługuje tego natywnie. Planowaliśmy dodać to do następnej wersji. Jednak wsparcie można łatwo dodać, konfigurując odpowiednie powiązanie. Po prostu załaduj moduł poniżej i ciesz się.
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>();
}
}
}
Dzięki za kod! Z niecierpliwością czekam na kolejną wersję. –
Dzięki za całą ciężką pracę Remo. Czy możliwe jest rozszerzenie kodu do pracy z Func>? –
Anders
Pewnie, że tak. Zmień metodę FunctionFactory.Create, sprawdź wartość IEnumerable i zwróć wartość GetAll. –