[英]How do I Instantiate component as Singleton at registration?
我可以想象这在 Castle 中可能很简单,但我是这项技术的新手,并且已经在谷歌上搜索了几个小时但没有运气!
我有以下几点:
container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
() => new MySpecialClass()).LifeStyle.Singleton);
现在完全正确的是,这是延迟加载的,即传递给 UsingFactoryMethod() 的 lambda 表达式在我实际要求 Castle 解析我类的实例之前不会执行。
但是我希望 Castle 在注册后立即创建实例。 这可能吗?
对于这个简单的情况,您可以只注册一个现有实例:
var special = new MySpecialClass();
container.Register(Component.For<MySpecialClass>().Instance(special));
您可以像这样使用内置的可启动工具:
container.AddFacility<StartableFacility>();
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start());
你可以在这里阅读
重新使用“实例”的答案可能并不总是可行(如果类本身具有依赖层,则不容易对其进行更新)。 在这种情况下,至少在 Windsor 2.5 中,您可以使用它:
public static void ForceCreationOfSingletons(this IWindsorContainer container)
{
var singletons =
container.Kernel.GetAssignableHandlers(typeof (object))
.Where(h => h.ComponentModel.LifestyleType == LifestyleType.Singleton);
foreach (var handler in singletons)
{
container.Resolve(handler.ComponentModel.Service);
}
}
// usage container.ForceCreationOfSingletons();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.