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

cbp*_*cbp 10 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;
    }

    ......
}
Run Code Online (Sandbox Code Playgroud)

想象一下,name是Person类的要求,因此,为了确保Person始终具有名称,我们要求将其传递给构造函数.

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

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

cbp*_*cbp 8

自从我提出这个问题以来已经有一年多的时间了,而且我现在比我当时知道得多.Kevin的答案是正确的,也是最佳实践,但有时您需要使用遗留类,并希望在我的问题中做一些类似的事情.以下是我使用NInject进行的操作:

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

    private string _name;

    public Person(string name)
    {
         _name = name;
         StaticKernelContainer.Inject(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Kev*_*hon 5

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