9

人们普遍认为,在应用程序周围传递 IoC 容器并将其用作服务定位器是不好的做法。

我更喜欢仅在我的应用程序的复合根中使用容器,并且倾向于对 Resolve() 进行一次调用 - 解析我的应用程序中的顶级对象并回复容器以将依赖项注入对象图中较低的类。

Castle Windsor 最近添加了一种范围生活方式,您可以在其中调用 container.BeginScope() 在“使用”块中。在此“使用”块中,解析使用范围生活方式注册的组件将在“使用”块的持续时间内每次返回相同的实例。

container.Register(Component.For<A>().LifestyleScoped());

using (container.BeginScope())
{
    var a1 = container.Resolve<A>();
    var a2 = container.Resolve<A>();
    Assert.AreSame(a1, a2);
}

问题:鉴于 BeginScope() 是容器上的扩展方法,我看不到如何在应用程序中使用作用域生活方式,除非容器被传递(我真的不想这样做)。有没有人有任何关于在哪里/如何使用范围生活方式的例子?

谢谢,

汤姆

4

1 回答 1

7

我认为使用通常是在工厂内部,通常可以看到容器。想象一个 Web 应用程序:从某种意义上说,MVC 应用程序或“页面”中控制器的每次调用都在运行一个半独立的程序。让那个“程序”解决它自己的依赖关系并不是不合理的。也就是说,每个控制器调用都应该使用容器解决其依赖关系。

在特定 Web 请求、TCP 请求或用户会话的范围内,您可能希望容器以不同的方式解析对象。这是您在自己的工厂内干净利落地这样做的一种方式。与 IoC 的所有用途一样,您必须小心不要滥用它,以免业务逻辑最终潜入您的注册代码。

于 2012-10-06T01:28:48.027 回答