我正在阅读“.NET Platform 2nd Edition 上的依赖注入”(俄语,春季发布)。作者清楚地写了几次-
使用 DI 容器时,组合根必须是使用该容器的唯一位置。在组合根之外使用 DI 容器会导致 Service Locator 反模式,这将在下一章中讨论。
举个例子,说明它很丑。好吧,假设我同意。
我有一个 WPF(或任何其他)桌面应用程序。我认为每次按下 UI 中的某个“按钮”都是一个单独范围内的操作。那些。API 的一部分应该创建与生命相对应的实例。通常,在 ICommand.Execute 处理程序中,有以下伪代码:
void ICommand.Execute(object parameter)
{
using (DI.CreateSomeScope())
new SomeCommand(...).Execute(parameter);
}
有两个问题,第一个很重要,第二个在评论中整理出来,但也许有人对这个问题有自己的看法 - 也分享一下:
- 我怎样才能在这里声明一个范围?根据本书和大多数 DI 框架,范围完全是容器的责任。将它拖到这里是一个显式的服务定位器。
- 怎么办
new SomeCommand?嗯,即 例如,程序的主窗口已经在运行,我想要的一切都显示出来了。然后用户点击“设置”。我需要创建一个设置 VM,然后将其分配给一个 binned 属性以更改应用程序。并且 DI 再次负责创建不稳定的(vm 非常适合不稳定的)依赖项。我真的不明白如何在应用程序生命周期的中间实例化对象。在书中,作者主要展示了基本的例子,或者是aspnet,其中有一个预谋的点——创建一个控制器来处理请求。




