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.
我知道可以使用属性注入名称或存储库,但这不是一个干净的解决方案 - 我们正在失去一些编程语言的语义能力.
自从我提出这个问题以来已经有一年多的时间了,而且我现在比我当时知道得多.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的实现.
如上所述,该类不适合与IOC容器一起使用.您将这里的问题与持有某种状态(名称)和执行某些操作(无论存储库用于何处)的Person实体混合在一起.如果你重构你的代码,以便通过一个通过构造函数实现IPersonRepository的类来检索或创建Person实体,那么你将处于依赖注入更有意义的地方.
| 归档时间: |
|
| 查看次数: |
1948 次 |
| 最近记录: |