2011-08-18 12 views
6

Me imagino que esto podría ser bastante sencillo de hacer en Castle pero soy nuevo en la tecnología y he estado buscando en Google durante horas ¡sin suerte!¿Cómo puedo crear una instancia de componente como Singleton en el registro?

Tengo el siguiente:

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

Ahora con razón esto es ser vago-cargado, es decir, la expresión lambda pasado a UsingFactoryMethod() no está siendo ejecutado hasta que realmente pido a Castillo a resolver el instancia de la clase.

Pero me gustaría que Castle cree la instancia tan pronto como la haya registrado. es posible?

Respuesta

8

sólo puede utilizar el construido instalaciones iniciable de este modo:

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

Usted puede leer sobre él here

7

Por este simple caso de que sólo pudiera register an existing instance:

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

¡Gracias! Esto es lo que terminé usando - container.Register (Component.For (). Instance (new MySpecialClass())); – jameskind

+1

Esto no se ve como el mejor enfoque ya que no se está dejando la creación de instancias en el contenedor y, por lo tanto, se está rompiendo el patrón de IoC. –

+0

@DavidPerlman Derecho, cuando escribí esta respuesta, creo que no fue tan fácil como lo describe la respuesta reciente de MosheLevi. –

1

La respuesta está utilizando "Instancia" no siempre puede ser factible (si la clase tiene capas de sí mismo dependencias, no va a ser fácil de nueva arriba). En ese caso, al menos en Windsor 2.5, se puede usar esto:

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(); 
Cuestiones relacionadas