2011-02-12 11 views

Respuesta

18

StructureMap admite setter/property injection. Por lo que podría hacer lo siguiente:

public class SomeController : Controller 
{ 
    [SetterProperty] 
    public IService Service { get; set; } 
} 

y luego:

ObjectFactory.Initialize(x => 
{ 
    x.For<IService>() 
    .Use<ServiceImpl>(); 
}); 

o si no te gusta la idea de que saturan sus controladores con StructureMap atributos específicos que podrían configurar de esta manera:

ObjectFactory.Initialize(x => 
{ 
    x.For<IService>() 
    .Use<ServiceImpl>(); 

    x.ForConcreteType<SomeController>() 
    .Configure 
    .Setter<IService>(c => c.Service) 
    .IsTheDefault(); 
}); 

También tenga en cuenta que la inyección de propiedad es adecuada en escenarios donde la presencia de esta propiedad no es obligatoria para el correcto funcionamiento del controlador. Por ejemplo, piense en un registrador. Si el consumidor del controlador no inyecta ninguna implementación específica de un registrador en la propiedad, el controlador aún funciona, es solo que no se registra. En su caso, está utilizando un servicio y yo usaría la inyección de constructor si las acciones de su controlador dependen de este servicio. Entonces, la pregunta que debe hacerse es: ¿se bloqueará mi controlador cuando llame a alguna de sus acciones si esta propiedad es null? Si la respuesta a esta pregunta es sí, entonces recomendaría la inyección de constructor. Además, cuando utiliza una inyección de constructor, obliga al consumidor de este controlador a especificar una implementación porque no puede obtener una instancia del controlador sin pasar un servicio adecuado en el constructor.

+1

Gracias Darin. Todavía estoy tratando de decidir entre 'StructureMap' y' Castle.Windsor' para mi proyecto, y la inyección de propiedades es muy importante para mí. ¿Sabes si 'StructureMap' puede inyectar en MVC Action Filters o Model Binders? – Ciel

+0

Además, la propiedad a la que se aplica el atributo del setter debe ser pública. (Al menos eso es lo que he encontrado). Tiene mucho sentido, pero es fácil pasarlo por alto si lo estás agregando a una clase y punta ya existente, como yo. De lo contrario, su propiedad será nula. – Sean

4

para inyectar dependencias para todas las propiedades de un tipo determinado, utilice el método SetAllProperties como parte de la inicialización de la ObjectFactory:

ObjectFactory.Initialize(x => 
{ 
    x.SetAllProperties(x => x.OfType<IService>()); 
}); 

También es posible definir políticas para inyección organismo, ver this post.

Cuestiones relacionadas