【发布时间】:2011-11-23 01:39:27
【问题描述】:
有时我们可以使用 DI 容器做一些巧妙的技巧,例如:自动绑定、管理单例、管理每个请求一个实例等。这很棒,并且可以真正简化一些场景。
我遇到的问题是某个特定类的关注点现在会泄露到应用程序层。如果一个类希望以特定方式实例化和管理(例如,作为单例,或每个 http 请求仅一次),那么现在由应用层来确保这种情况发生。
出现的一些问题:
1) 潜在的错误,因为应用程序可能会错误地设置 DI 绑定。
2) 当开发人员想要实现一个包时可能会造成混淆,因为设置 DI 容器的规则不是由包本身提供的,因此必须记录在 cmets 或随附的测试用例中(其中不理想)。
3) 如果类的实现发生变化,现在每个使用该类的应用程序都有责任更新其 DI 容器绑定。
以下是您可以使用 NInject 执行的一些示例绑定,它们都存在此问题:
public class MyApplicationsInjectionModule : NInjectModule
{
public void Load()
{
Bind<IFoo>().ToConstant(FooThatShouldBeASingleton.Instant);
Bind<IFoo>().To<FooThatShouldBeASingleton>().AsSingleton();
Bind<IFoo>().To<FooThatShouldOnlyBeInstantiatedOncePerRequest>().InRequestScope();
}
}
我的经验仅限于 NInject - 也许其他一些 DI 容器可以更优雅地处理这个问题。
在不放弃 DI 容器提供的功能的情况下,我们可以采取哪些策略来避免这些问题?
【问题讨论】:
标签: dependency-injection separation-of-concerns