Castle.Windsor每个要求的生活方式:子容器与定制生活方式

时间:2011-09-06 05:26:40

标签: castle-windsor

我需要Castle.Windsor的按要求生活方式。这不是一个ASP应用程序,本机PerWebRequest生活方式将无法正常工作。

在处理请求之前(针对每个请求):

MyContainer = new Container();
MyContainer.Register(
    Component.For<ICache>().ImplementedBy<Cache>().LifeStyle.Singleton
    );
MyMainStaticContainer.AddChildContainer(MyContainer);
//MyMainStaticContainer contains implementations which
//can be shared across requests

然后在代码的某处:

MyContainer.Resolve<ICache>().Items.Add("x", "y");
...
MyContainer.Resolve<ICache>().Items.Get("x");

最后,当工作完成时(在ASP中,它将在Application_EndRequest中)

MyContainer.Parent.RemoveChildContainer(MyContainer);
MyContainer.Dispose();

这非常优雅(如:不是很多步骤,简单易懂)并且它对我有用,但我很好奇如果实现自定义生活方式会更好(更安全?,效率更高?)。< / p>

提前致谢,

Tymek

1 个答案:

答案 0 :(得分:0)

你试过&#34; 瞬态&#34;?

此链接可帮助您根据需要选择合适的链接: CastleProject - Lifestyles

注意:为了避免在每次请求时注册此内容,您可能希望利用Windsor.config中的ID。 ID将允许您拥有多个ICache实现,您可以使用Interface-ID组合键将它们从Windsor中拉出来。

Windsor.config中的

<component id="MyDefaultCache"
           service="MyAssembly.ICache, MyAssembly"
           type="MyAssembly.MyDefaultCache, MyAssembly" />
<component id="MySpecialCache" 
           service="MyAssembly.ICache, MySpecialCache"
           type="MySpecialAssembly.MySpecialCache, MySpecialAssembly" />

并在代码中

MyContainer.Resolve<ICache>("MySpecialCache")

第一个始终是默认值,因此 MyContainer.Resolve<ICache> 将解析为 MyAssembly.MyDefaultCache