Dependency injection 温莎城堡-了解短暂的生活方式

Dependency injection 温莎城堡-了解短暂的生活方式,dependency-injection,castle-windsor,lifecycle,Dependency Injection,Castle Windsor,Lifecycle,新来的城堡,温莎,我只是想看看 我一直在阅读有关暂时性生活方式和“发布您所解决的问题”的书籍,我已经为我的ASP.NET MVC3应用程序创建了一个资源提供程序,并正在我的新资源提供程序工厂(ASP.NET中的资源访问“中心”)中解决它: IContainerAccessor accessor=HttpContext.Current.ApplicationInstance作为IContainerAccessor; IResourceProvider provider=accessor.Conta

新来的城堡,温莎,我只是想看看

我一直在阅读有关暂时性生活方式和“发布您所解决的问题”的书籍,我已经为我的ASP.NET MVC3应用程序创建了一个资源提供程序,并正在我的新资源提供程序工厂(ASP.NET中的资源访问“中心”)中解决它:

IContainerAccessor accessor=HttpContext.Current.ApplicationInstance作为IContainerAccessor;
IResourceProvider provider=accessor.Container.Resolve(新参数(new{resourceName=resourceName}));
LoggerService.Information(String.Format(“Tracking?{0}”、accessor.Container.Kernel.ReleasePolicy.HasTrack(provider));
IResourceProvider
是暂时的,因此我可以将不同的
resourceName
传递给构造函数(因此可以从不同的资源文件返回不同的标签)

我担心我需要对这些
IResourceProvider
对象显式调用
Release
,但是我的
HasTrack
检查总是返回
false
-所以我认为这是一件好事

容器没有跟踪此对象,因此GC将(最终清理此对象)


那么容器什么时候会跟踪这个对象呢?如果它有创建佣金问题的话?

您只发布您明确要求的组件。 有两种方法可以显式获取组件:

a) 解析,您在上面使用过。一般来说,在应用程序中只进行一次解析调用是一种很好的做法。因此,您可能需要查看TypedFactoryFacility

b) 工厂的使用。在本例中,您将使用TypeFactoryFacility。如果您从工厂获得组件,则在以下情况下,该组件及其依赖项将被释放:

  • 您可以通过在工厂上调用“destroy”方法来显式释放它
  • 或者它自己被释放的工厂

如果您没有明确创建组件,您就永远不必发布它。

和blogpost详细讨论了这个主题。

谢谢Marwijn,但我在示例代码中明确要求提供我的IResourceProvider,但它没有被跟踪(我认为这是因为我已经解决了)。如果我使用类型化工厂,我仍然需要解析工厂,这样我就不会以这种方式隐藏容器(我知道这对工厂有好处吗?)。但我想我明白你的意思,通过使用工厂,IResourceProvider创建的工厂是由工厂拥有的,并将在工厂启用时发布。什么时候发布打印工厂?你好,尼尔,我掌握的信息有限,我真的无法判断你是否应该使用工厂。我只是想指出,在应用程序中使用多个解析是一种反模式。您是对的,容器没有理由跟踪您的组件,因为您没有任务需求。但是,请注意,将依赖项添加到具有依赖项的资源提供程序(如IDisposable)将足以对其进行跟踪。我的建议是在保存站点上,完成后发布。谢谢Marwijn-非常感谢您的评论。我认为ASP.NET没有提供一个干净的钩子来注入这种资源工厂的事实是没有帮助的。基本上,我正在尝试使用温莎版本,但避免使用服务定位器样式是可能的。也许wcf设施可以帮助您:
IContainerAccessor accessor = HttpContext.Current.ApplicationInstance as IContainerAccessor;            
IResourceProvider provider = accessor.Container.Resolve<IResourceProvider>(new Arguments(new { resourceName = resourceName }));

LoggerService.Information(String.Format("Tracking? {0}", accessor.Container.Kernel.ReleasePolicy.HasTrack(provider)));