2009-05-12 9 views
5

Algunos contenedores de inyección de dependencia le permiten inyectar servicios configurados en un objeto ya construido.Windsor castle Propiedades de inyección del objeto construido

¿Se puede lograr esto con Windsor, teniendo en cuenta las dependencias de servicio que pueda haber en el objeto de destino?

+2

duplicado: http://stackoverflow.com/questions/447193 –

+0

No es un duplicado de esa pregunta. La pregunta a la que se hace referencia pregunta si windsor puede resolver objetos que no están registrados. – PhilHoy

Respuesta

5

No, no puede.

1

Como dijo Krzysztof, no hay una solución oficial para esto. Quizás quieras probar this workaround.

Personalmente, considero que tengo que hacer un olor a código. Si es su código, ¿por qué no está registrado en el contenedor? Si no es su código, escriba una fábrica/adaptador/etc. para ello.

+0

Estoy de acuerdo, es un olor. ¿Por qué quieres hacerlo en primer lugar? Está claro que está mal. –

+0

Tengo un caso bastante simple en el que necesito hacer esto: – Steve

+0

Creo una instancia a través del contenedor, luego en algún punto serializo mi instancia. Sin embargo, no quiero serializar las dependencias. Cuando me deserializo, necesito agregar las dependencias al objeto. ¿Cómo resolvería este problema usando Castle Windsor? – Steve

9

Esta es una vieja pregunta, pero Google me guió aquí recientemente, así que pensé que iba a compartir mi solución para que no ayudara a alguien que buscara algo como el método BuildUp de StructureMap para Windsor.

Me pareció que podía agregar esta funcionalidad yo mismo con relativa facilidad. Aquí hay un ejemplo que simplemente inyecta dependencias en un objeto donde encuentra una propiedad nula Tipo de interfaz. Se podría extender el concepto más lejos, por supuesto, para buscar un atributo particular etc:

public static void InjectDependencies(this object obj, IWindsorContainer container) 
{ 
    var type = obj.GetType(); 
    var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    foreach (var property in properties) 
    { 
     if (property.PropertyType.IsInterface) 
     { 
      var propertyValue = property.GetValue(obj, null); 
      if (propertyValue == null) 
      { 
       var resolvedDependency = container.Resolve(property.PropertyType); 
       property.SetValue(obj, resolvedDependency, null); 
      } 
     } 
    } 
} 

Aquí es una prueba de unidad simple para este método:

[TestFixture] 
public class WindsorContainerExtensionsTests 
{ 
    [Test] 
    public void InjectDependencies_ShouldPopulateInterfacePropertyOnObject_GivenTheInterfaceIsRegisteredWithTheContainer() 
    { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<IService>().ImplementedBy<ServiceImpl>()); 

     var objectWithDependencies = new SimpleClass(); 
     objectWithDependencies.InjectDependencies(container); 

     Assert.That(objectWithDependencies.Dependency, Is.InstanceOf<ServiceImpl>()); 
    } 

    public class SimpleClass 
    { 
     public IService Dependency { get; protected set; } 
    } 

    public interface IService 
    { 
    } 

    public class ServiceImpl : IService 
    { 
    } 
} 
+2

Por cierto, Necesitaba esta funcionalidad para inyectar dependencias en un ActionFilter para MVC.NET. –

Cuestiones relacionadas