构造函数注入其他非依赖构造函数参数

时间:2009-11-06 05:08:12

标签: constructor ninject code-injection

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

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

例如:

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

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

    ......
}

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

我们如何使用NInject获取Person的实例?该名称需要通过应用程序创建新Person的任何位置传入,而IOC容器需要传入IPersonRepository。

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

3 个答案:

答案 0 :(得分:8)

自从我提出这个问题以来,已经有一年多的时间了,而且我现在比以前知道得多。 Kevin的答案是正确的,也是最佳实践,但有时您需要使用遗留类,并希望在我的问题中做一些类似的事情。以下是我使用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的实现。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

我恭敬地不同意Kevin McMahon上面的回应,原因是我看到依赖注入代码完全符合你的要求......只能使用不同的IoC容器。也就是说,它是Castle Windsor,它是另一个Ioc容器。它允许你在配置文件中创建一个部分来说明为name提供什么值(对于名称来说没有多大意义,但如果它是像“connectionString”这样的属性,它可能会产生很多感)。

所以...并不是你想要做的事情并不适合一般的依赖注入...只是Ninject似乎不适应它(或者也许Ninject也可以容纳它...我不知道它所用的所有较少使用的功能是否足以说明。)