尝试使用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?
答案 0 :(得分:0)
实际上,问题不在于C
服务的绑定,而在于B
的绑定。
默认的Factory实例提供程序将为以Get
开头的方法创建命名绑定(请参阅here)。
将工厂方法更改为Get
以外的其他方法,或者添加此方法以为B
创建空命名绑定:
kernel.Bind<B>().ToSelf().Named("");