Castle.Windsor - 了解短暂的生活方式

时间:2013-05-03 11:15:32

标签: dependency-injection castle-windsor lifecycle

Castle.Windsor的新手,只是想检查一下。

我一直在阅读关于瞬态生活方式和“释放你解决的问题” - 我为我的ASP.NET MVC3应用程序创建了一个资源提供程序,并在我的新资源提供程序工厂(这是“中心”)中解析它用于ASP.NET中的资源访问:

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)));

IResourceProvider是暂时的,因此我可以将不同的resourceName传递给构造函数(因此可以从不同的资源文件返回不同的标签)。

我担心我需要在这些Release个对象上明确调用IResourceProvider,但我的HasTrack检查始终返回false - 所以我认为这是一件好事?

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

那时容器会跟踪此对象 - 如果它有创建佣金问题吗?

2 个答案:

答案 0 :(得分:3)

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

a)您在上面使用的Resolve。通常,在应用程序中只有一个解析调用是一个好习惯。所以你可能想看一下TypedFactoryFacility。

b)使用工厂。在这种情况下,您将使用TypeFactoryFacility。如果您从工厂获得组件,它的依赖关系将在以下时间发布:

  • 通过在工厂中调用“destroy”方法明确释放它。
  • 或者它自己的工厂被释放。

如果您没有明确创建组件,则永远不必释放它。

答案 1 :(得分:2)

Thisthis blogpost详细讨论了该主题。