是否可以在Castle Windsor使用范围生活方式而不通过容器?

时间:2012-10-05 22:14:08

标签: c# dependency-injection inversion-of-control castle-windsor ioc-container

人们普遍认为,在您的应用程序中传递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()是容器上的扩展方法,我无法看到如何在应用程序中使用作用域生活方式,除非容器被传递(我真的不喜欢)我不想这样做。有没有人有关于使用范围生活方式的地点/方式的任何例子?

谢谢,

汤姆

1 个答案:

答案 0 :(得分:7)

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

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