我得到了微小的界面ITest:
public interface ITest
{
void DoSomething();
}
以及ITest的一些实现
public class Test : ITest
{
public void DoSomething()
{
throw new NotImplementedException();
}
}
public class Test2 : ITest
{
public void DoSomething()
{
throw new NotImplementedException();
}
}
public class Test3 : ITest
{
public void DoSomething()
{
throw new NotImplementedException();
}
}
public class Test4 : ITest
{
public void DoSomething()
{
throw new NotImplementedException();
}
}
现在我设置了Ninject:
kernel.Bind<ITest>().To<Test>().Named("Test");
kernel.Bind<ITest>().To<Test2>().Named("Test");
kernel.Bind<ITest>().To<Test3>().Named("Test");
kernel.Bind<ITest>().To<Test4>().Named("Test");
这是我的第一个问题。
如果我试图使用
获取实例ITest test = kernel.Get<ITest>("Test");
导致异常“激活ITest时出错多个匹配的绑定可用。...”。文档说:“通过使用具有指定名称的第一个绑定获取指定服务的实例。”
第二个问题:
List<ITest> servicesList = new List<ITest>(kernel.GetAll<ITest>("Test"));
导致异常“激活字符串时出错没有匹配的绑定可用,并且该类型不可自我绑定....”。文档说:“使用使用指定名称注册的绑定获取指定服务的所有实例。”
有什么想法吗?提前谢谢!
答案 0 :(得分:4)
您为所有实例提供了相同的名称Test
,因此这是不正常的。在注册内核时给他们不同的名字:
kernel.Bind<ITest>().To<Test>().Named("Test1");
kernel.Bind<ITest>().To<Test2>().Named("Test2");
kernel.Bind<ITest>().To<Test3>().Named("Test3");
kernel.Bind<ITest>().To<Test4>().Named("Test4");
现在您可以按名称获取实例:
ITest test = kernel.Get<ITest>("Test3");
为了得到它们,你不再需要一个名字:
List<ITest> servicesList = kernel.GetAll<ITest>().ToList();