StructureMap supports setter/property injection. So you could do the following:
public class SomeController : Controller
{
[SetterProperty]
public IService Service { get; set; }
}
and then:
ObjectFactory.Initialize(x =>
{
x.For<IService>()
.Use<ServiceImpl>();
});
or if you don't like the idea of cluttering your controllers with StructureMap specific attributes you could configure it like this:
ObjectFactory.Initialize(x =>
{
x.For<IService>()
.Use<ServiceImpl>();
x.ForConcreteType<SomeController>()
.Configure
.Setter<IService>(c => c.Service)
.IsTheDefault();
});
Also note that property injection is suitable in scenarios where the presence of this property is not compulsory for the correct functioning of the controller. For example think of a logger. If the consumer of the controller doesn't inject any specific implementation of a logger into the property the controller still works it's just that it doesn't log. In your case you are using a service and I would use constructor injection if your controller actions depend on this service. So the question you should ask yourself is: will my controller crash when I call some its action if this property is null
? If the answer to this question is yes then I would recommend constructor injection. Also when you use a constructor injection you force the consumer of this controller to specify an implementation because he cannot obtain an instance of the controller without passing a proper service in the constructor.
StructureMap
andCastle.Windsor
for my project, and property injection is very important to me. Do you know ifStructureMap
can inject into MVC Action Filters or Model Binders? – Owen