ofl*_*lad 2 c# dependency-injection ninject ioc-container
我已经看到像Ninject这样的框架以及Stack上的帖子都在使用依赖注入框架(例如下面的代码)时谈到了自绑定。
Bind<Samurai>().To<Samurai>();
Run Code Online (Sandbox Code Playgroud)
他们甚至为此具有特殊的语法:
Bind<Samurai>().ToSelf();
Run Code Online (Sandbox Code Playgroud)
为什么要将类型绑定到自身?我看不到有任何实用的应用程序可以解决此问题,并有助于减少代码中的依赖性。这是否仅意味着对类型的引用会简单地解决自身问题?
在应用依赖注入并遵循依赖反转原则时,通常的建议是对接口进行编程,而不是对实现进行编程。这就是为什么大多数时候您会看到从抽象到实现的绑定的原因:
Bind<IWarrior>().To<Samurai>();
Run Code Online (Sandbox Code Playgroud)
这意味着组件将IWarrior在编译时依赖,并且我们Samurai在运行时注入。
但是,在某些情况下,从具体组件到自身的映射是有意义的。换句话说,如果“某人”请求a Samurai,我们将为其提供a Samurai。
最突出的情况是解析根类型时。根类型是依赖关系图的顶部;根类型直接从容器中解析。所有其他类型都是根类型的直接或间接依赖项。
通常,您会看到这些根类型由其具体类型解析,并且通常我们正在处理UI框架。这样的示例是Web表单Page,MVC Controller,Web API ApiController等。
大多数DI容器始终允许解析未注册的具体类型。这可能会使您相信自绑定是多余的,但并非总是如此。显式添加此类绑定可以使容器知道此类绑定的存在。这具有使用容器的诊断能力(如果存在)来扫描对象图是否存在错误的优点。如果没有这种功能,通常可以迭代已知的注册并在单元测试中进行一些验证。为了使这种验证在迭代容器的注册时有意义,所有根类型都需要在容器中注册。否则,此验证过程将导致假阴性。
想要告诉DI容器有关自绑定的另一个原因是,当容器不允许解析未注册的类型时,或者当您需要使用不同于容器默认生活方式的生活方式来注册类型时。万一没有注册类型,大多数容器都会给您一个Transient实例。
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |