Daniel A. White
Daniel A. White

Reputation: 190945

IoC and ASP.NET MVC Controllers

Should I do something along the lines of this? I'm thinking of all my controllers inheriting from BaseController. Does this break the design pattern of IoC? What else should I do instead?

public class BaseController: Controller
{
    protected ICookieService CookieService {
        get {
            return ServiceResolver.Resolve<ICookieService>(new { HttpContext = HttpContext });
        }
    }
    protected IDateTimeService DateTimeService { 
        get {
            return ServiceResolver.Resolve<IDateTimeService>();
        }
    }
    protected ISettingsService SettingsService {
        get {
            return ServiceResolver.Resolve<ISettingsService>();
        }
    }

}

Upvotes: 5

Views: 3204

Answers (3)

Rinat Abdullin
Rinat Abdullin

Reputation: 23552

One of the principles behind Inversion of Control and Component-Driven Development is about using static service locators only when there is no other way (i.e.: in web service hosts or object data sources).

Technically speaking, using static service locators the base controller does not violate IoC, it just does not use it.

Check out existing integration between Autofac IoC container and ASP.NET MVC (other containers should be able to do that as well).

Upvotes: 0

Darren
Darren

Reputation: 961

I'm assuming that the protected interfaces you have are dependencies for the controller. Its possible to set up an IoC container to inject the dependencies for you. It can certainly be done with Castle Windsor. You would need to change you BaseController class to have a constructor with the required dependencies, as long as the IoC container knows about the other services it'll be able to inject them.

Upvotes: 0

Yann Schwartz
Yann Schwartz

Reputation: 5994

It would be a lot simpler to go with constructor injection and have a controllerfactory inject it for you. If you can, don't use a service locator (your ServiceResolver ) if you can get away with constructor injection.

There's some info on it on Adding a controller factory to ASP MVC

The link shows how to do it with StructureMap and it looks like you're using Unity, but it should be straightforward to adapt.

Upvotes: 10

Related Questions