Autofac自动生成工厂Func<T>
; 我甚至可以传递参数.
public class MyClass
{
public MyClass(Func<A> a, Func<int, B> b)
{
var _a = a();
var _b = b(1);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以和Ninject一样吗?如果没有,我可以申请哪种解决方法?
谢谢.
更新:
刚发现这篇帖子,似乎答案是否定的:
Rem*_*oor 29
NB Ninject 3.0及更高版本使用该Ninject.Extensions.Factory
软件包完全支持,请参阅wiki: - https://github.com/ninject/ninject.extensions.factory/wiki
编辑:NB Bind<T>().ToFactory()
Ninject 2.3中有一个实现(它不是完全测试支持的版本,但可以从CodeBetter服务器获得)
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>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5179 次 |
最近记录: |