Ninject获取实例的问题

时间:2011-07-05 14:02:20

标签: asp.net-mvc dependency-injection ninject

我得到了微小的界面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"));

导致异常“激活字符串时出错没有匹配的绑定可用,并且该类型不可自我绑定....”。文档说:“使用使用指定名称注册的绑定获取指定服务的所有实例。”

有什么想法吗?提前谢谢!

1 个答案:

答案 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();