我可以想象这在Castle中可能会非常直接,但我对这项技术不熟悉并且谷歌几个小时都没有运气!
我有以下内容:
container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
() => new MySpecialClass()).LifeStyle.Singleton);
现在非常正确,这是延迟加载的,即传递给UsingFactoryMethod()的lambda表达式在我实际要求Castle解析类的实例之前没有被执行。
但是我希望Castle在我注册后立即创建实例。这可能吗?
答案 0 :(得分:10)
您可以使用构建它的Startable工具,如下所示:
container.AddFacility<StartableFacility>();
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start());
您可以阅读here
答案 1 :(得分:9)
对于这个简单的案例,您可以register an existing instance:
var special = new MySpecialClass();
container.Register(Component.For<MySpecialClass>().Instance(special));
答案 2 :(得分:1)
使用“实例”的答案可能并不总是可行的(如果类本身具有依赖层,则新建它将不容易)。 在这种情况下,至少在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();