I am using MVC 3. Suppose I have a Base Controller and several derived controllers. I am using IoC and my base controller constructor looks like this:
private readonly ICacheProvider _cacheProvider;
private readonly ILoggerProvider _loggerProvider
private readonly IAuditProvider _auditProvider
public abstract class MyControllerBase : Controller
{
protected MyControllerBase(ICacheProvider cacheProvider, ILoggerProvider loggerProvider, IAuditProvider auditProvider, ...)
{
_cacheProvider = cacheProvider;
_loggerProvider = loggerProvider;
_auditProvider = auditProvider;
...
}
}
So far so good? Maybe. However, each of my derived controllers needs to define a constructor that matches the base class constructor signature, for example:
public class MyDerivedController1 : MyControllerBase
{
public MyDerivedController1(ICacheProvider cacheProvider, ILoggerProvider loggerProvider, IAuditProvider auditProvider, ...)
: base(cacheProvider, loggerProvider, auditProvider, ...)
{ }
}
And that is my problem, because I have to maintain the "verbose" constructor in all my derived controllers. If I need to add a new provider I have to refactor all my derived controllers.
I thought I would create a ServiceProvider (or Service Locator ?) class (and IServiceProvider interface), which would have a constructor and all providers as parameters (where IoC would do its job) and expose them as properties. Then my base constructor and derived constructors would only have the IServiceProvider as a parameter.
However I am concerned that this approach will have some negative impacts, for example: 1- Hidden implementation: I don't know which provider I use or need unless I check the implementation. 2- Hard to test: when the constructor contains parameters I can easily test it and I know what to expect (auto-documented).
Does anyone have any suggestion or comments?