10

我是 IOC 容器的新手,我开始使用 NInject。

如果您希望您的构造函数具有不是服务且不需要由 IOC 容器实例化的参数,您会怎么做?

例如:

public class Person
{
    private readonly string _name;
    private readonly IPersonRepository _repository;

    public Person(string name, IPersonRepository repository)
    {
        _name = name;
        _repository = repository;
    }

    ......
}

假设名称是 Person 类的要求,因此,为了确保 Person 始终具有名称,我们需要将其传递给构造函数。

我们如何使用 NInject 获得 Person 的实例?名称需要通过应用程序的任何部分来创建一个新的人,而 IOC 容器需要传入 IPersonRepository。

我知道可以使用属性来注入名称或存储库,但这不是一个干净的解决方案 - 我们正在失去一些编程语言的语义能力。

4

3 回答 3

8

我问这个问题已经一年多了,现在我知道的比当时还多。凯文的回答是正确的,也是最佳实践,但有时您需要使用遗留类并想做一些像我在我的问题中遇到的事情。这是我使用 NInject 的方法:

public class Person
{
    [Inject]
    public IPersonRepository PersonRepository { get; set; }

    private string _name;

    public Person(string name)
    {
         _name = name;
         StaticKernelContainer.Inject(this);
    }
}

可以在 NInject Web 扩展项目中找到 StaticKernelContainer 的实现。

于 2011-04-19T05:09:07.973 回答
5

如上所述,该类不适合与 IOC 容器一起使用。您在这里将关注点与持有某些状态(名称)并执行某些操作(无论存储库用于什么)的 Person 实体混合在一起。如果您重构代码,以便通过一个通过构造函数实现 IPersonRepository 的类来检索或创建 Person 实体,那么您将处于依赖注入更有意义的地方。

于 2009-11-06T05:23:08.180 回答
2

我恭敬地不同意 Kevin McMahon 的上述回复,原因是我已经看到依赖注入代码完全符合您的要求……仅使用不同的 IoC 容器。也就是说,它是 Castle Windsor,它是另一个 Ioc 容器。它允许您在配置文件中创建一个部分来说明为 name 提供哪些值(对 name 执行此操作没有多大意义,但如果它是像“connectionString”这样的属性,它可能会产生很多感觉)。

所以......这并不是说你正在尝试做的事情通常不适合依赖注入......只是Ninject似乎对它不满意(或者也许Ninject也可以适应它......我不'不知道它所有较少使用的功能足以说)。

于 2009-11-08T04:28:27.550 回答