C# 是否可以在温莎城堡使用范围内的生活方式,而无需将容器四处传递?

C# 是否可以在温莎城堡使用范围内的生活方式,而无需将容器四处传递?,c#,dependency-injection,inversion-of-control,castle-windsor,ioc-container,C#,Dependency Injection,Inversion Of Control,Castle Windsor,Ioc Container,人们普遍认为,在应用程序周围传递一个IoC容器并将其像服务定位器一样使用是不好的做法 我更喜欢只在应用程序的复合根中使用容器,并倾向于对Resolve()进行一次调用—解析应用程序中的顶级对象,并在容器上进行应答,以向对象图中较低的类注入依赖关系 Castle Windsor最近添加了一个作用域生活方式,您可以在“使用”块中调用container.BeginScope()。在这个“使用”块中,在“使用”块的持续时间内,解析一个注册了作用域生活方式的组件每次都将返回相同的实例 container.

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

我更喜欢只在应用程序的复合根中使用容器,并倾向于对Resolve()进行一次调用—解析应用程序中的顶级对象,并在容器上进行应答,以向对象图中较低的类注入依赖关系

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

container.Register(Component.For().LifestyleScoped());
使用(container.BeginScope())
{
var a1=container.Resolve();
var a2=container.Resolve();
Assert.AreName(a1,a2);
}
问题:考虑到BeginScope()是容器上的一个扩展方法,我无法理解如何在应用程序中使用范围限定的生活方式,除非容器被传递(我真的不想这样做)。是否有人有任何关于在何处/如何使用范围内的生活方式的例子

谢谢


Tom

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


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

您计划在哪里以及为什么使用范围生活方式?嗨,Krzystof,我还没有任何使用范围生活方式的计划。我只是想看几个例子,说明如何正确使用限定范围的生活方式,以防将来我想使用它。我想在工厂中使用它似乎是一种合乎逻辑的方法。这似乎与我需要的类似,我不想将作用域实例解析为构造函数中的依赖项,即同一作用域中的对象:已同意。在进一步思考和阅读之后,普遍的共识似乎是容器可以在入口点程序集“复合根”中使用(通过安装程序/引导程序和工厂),但不应该“泄漏”到包含应用程序域的其他程序集中。
container.Register(Component.For<A>().LifestyleScoped());

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