我需要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
答案 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