Tom*_*vis 8 c# dependency-injection castle-windsor ioc-container inversion-of-control
人们普遍认为,在您的应用程序周围传递IoC容器并像服务定位器一样使用它是不好的做法.
我更喜欢只在我的应用程序的复合根中使用容器,并倾向于只调用Resolve() - 解析我的应用程序中的顶级对象并回复容器以将依赖项注入对象图中较低的类.
Castle Windsor最近添加了一个scoped生活方式,您可以在"using"块中调用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);
}
Run Code Online (Sandbox Code Playgroud)
问:鉴于BeginScope()是在容器上的扩展方法,我看不出一个范围的生活方式可能,除非该容器被传来传去的应用程序(我真的不想做)一起使用.有没有人有任何关于范围生活方式可以使用的地方/方式的例子?
谢谢,
汤姆
我认为使用通常是在工厂内部,通常可以看到容器.想想一个Web应用程序:从某种意义上说,MVC应用程序或"页面"中每个控制器的调用都在运行一个半独立的程序.让"程序"解决自己的依赖关系并不是没有道理的.也就是说,每个控制器调用都应该使用容器来解析其依赖关系.
在特定Web请求,TCP请求或用户会话的范围内,您可能希望容器以不同方式解析对象.这是一种让您在自己的工厂内干净利落的方式.与IoC的所有用途一样,您必须小心不要滥用它,以便业务逻辑最终潜入您的注册码.