2011-08-18 58 views
6

我可以想象这在Castle中可能会非常简单,但我对这项技术很陌生,并且几个小时没有运气就一直在Google上搜索!如何在注册时将组件作为单例实例化?

我有以下几点:

container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
    () => new MySpecialClass()).LifeStyle.Singleton); 

现在非常正确,这是懒惰加载,即传递给UsingFactoryMethod()没有被执行的lambda表达式,直到我真正让城堡化解了我类的实例。

但是我希望Castle一旦注册它就创建实例。这可能吗?

回答

8

你可以只使用内置它可启动设备,像这样:

container.AddFacility<StartableFacility>(); 
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start()); 

你可以阅读一下here

7

对于你可以这个简单的例子只是register an existing instance

var special = new MySpecialClass(); 
container.Register(Component.For<MySpecialClass>().Instance(special)); 
+0

谢谢!这是我最终使用的 - container.Register(Component.For ()。Instance(new MySpecialClass())); – jameskind

+1

这看起来不是最好的方法,因为你没有离开实例到容器,因此打破了IoC模式。 –

+0

@DavidPerlman正确的是,当我回答这个问题时,我认为并不是像MosheLevi最近的回答所描述的那样简单。 –

1

再使用“实例”可能并不总是可行的(如果该类依赖自身的层答案,它不会是容易的新它)。 在这种情况下,至少在温莎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();