我是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。
我知道可以使用属性注入名称或存储库,但这不是一个干净的解决方案 - 我们正在失去一些编程语言的语义能力。
答案 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也可以容纳它...我不知道它所用的所有较少使用的功能是否足以说明。)