Ninject 工厂接口解析内核中缺少的构造函数参数
Ninject factory interface resolve missing constructor args from kernel
尝试使用 Ninject 的工厂扩展来做到这一点。
void Main()
{
IKernel kernel = new StandardKernel();
kernel.Bind<C>().ToMethod(ctx => new C());
kernel.Bind<IBFactory>().ToFactory();
var a = kernel.Get<A>();
a.Do();
}
public class A
{
IBFactory _fact;
public A(IBFactory factory)
{
_fact = factory;
}
public void Do()
{
_fact.Get("blah").Dump();
}
}
public class B
{
public B(C c, string s)
{
}
}
public interface IBFactory
{
B Get(string s);
}
public class C
{
}
工厂接口失败,因为它没有 C
可以扔进 B()
构造函数。但是它知道如何从内核中创建一个 C
,但是查找它超出了默认工厂方法实现的范围。
我可以自定义 IInstanceProvider
并将其传递到工厂方法中,例如 ToFactory(() => new myCustomIIProvider())
从内核解析 C
,但这似乎需要很多工作。
有没有更简单的方法让 Ninject 自行解决丢失的 ctor arg?
实际上,问题不在于 C
服务的绑定,而是 B
的绑定。
默认的 Factory 实例提供程序将为以 Get
开头的方法创建命名绑定(参见 here)。
要么将您的工厂方法更改为 Get
以外的方法,要么添加此方法以为 B
:
创建一个空的命名绑定
kernel.Bind<B>().ToSelf().Named("");
尝试使用 Ninject 的工厂扩展来做到这一点。
void Main()
{
IKernel kernel = new StandardKernel();
kernel.Bind<C>().ToMethod(ctx => new C());
kernel.Bind<IBFactory>().ToFactory();
var a = kernel.Get<A>();
a.Do();
}
public class A
{
IBFactory _fact;
public A(IBFactory factory)
{
_fact = factory;
}
public void Do()
{
_fact.Get("blah").Dump();
}
}
public class B
{
public B(C c, string s)
{
}
}
public interface IBFactory
{
B Get(string s);
}
public class C
{
}
工厂接口失败,因为它没有 C
可以扔进 B()
构造函数。但是它知道如何从内核中创建一个 C
,但是查找它超出了默认工厂方法实现的范围。
我可以自定义 IInstanceProvider
并将其传递到工厂方法中,例如 ToFactory(() => new myCustomIIProvider())
从内核解析 C
,但这似乎需要很多工作。
有没有更简单的方法让 Ninject 自行解决丢失的 ctor arg?
实际上,问题不在于 C
服务的绑定,而是 B
的绑定。
默认的 Factory 实例提供程序将为以 Get
开头的方法创建命名绑定(参见 here)。
要么将您的工厂方法更改为 Get
以外的方法,要么添加此方法以为 B
:
kernel.Bind<B>().ToSelf().Named("");