gpt4 book ai didi

ninject - Ninject 是否支持 Func(自动生成工厂)?

转载 作者:行者123 更新时间:2023-12-03 11:54:11 24 4
gpt4 key购买 nike

Autofac 自动为 Func<T> 生成工厂;我什至可以传递参数。

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?

最佳答案

NB Ninject 3.0 及更高版本使用 Ninject.Extensions.Factory 完全支持此功能包,请参阅 wiki:- https://github.com/ninject/ninject.extensions.factory/wiki

编辑:注意有一个 Bind<T>().ToFactory() Ninject 2.3 中的实现(不是完全测试支持的版本,而是 is available from the CodeBetter server)

Ninject 目前不支持 native 。我们计划将此添加到下一个版本。但是可以通过配置适当的绑定(bind)轻松添加支持。只需加载下面的模块并享受。

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

关于ninject - Ninject 是否支持 Func(自动生成工厂)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4840157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com