我正在使用 MVC 3。假设我有一个基本控制器和几个派生控制器。我正在使用 IoC,我的基本控制器构造函数如下所示:
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;
...
}
}
到现在为止还挺好?也许。但是,我的每个派生控制器都需要定义一个与基类构造函数签名匹配的构造函数,例如:
public class MyDerivedController1 : MyControllerBase
{
public MyDerivedController1(ICacheProvider cacheProvider, ILoggerProvider loggerProvider, IAuditProvider auditProvider, ...)
: base(cacheProvider, loggerProvider, auditProvider, ...)
{ }
}
这就是我的问题,因为我必须在所有派生控制器中维护“详细”构造函数。如果我需要添加一个新的提供者,我必须重构我所有的派生控制器。
我想我会创建一个 ServiceProvider(或 Service Locator?)类(和 IServiceProvider 接口),它将有一个构造函数和所有提供者作为参数(IoC 将在其中完成它的工作)并将它们作为属性公开。然后我的基本构造函数和派生构造函数将只有 IServiceProvider 作为参数。
但是我担心这种方法会产生一些负面影响,例如: 1- 隐藏实现:除非我检查实现,否则我不知道我使用或需要哪个提供程序。2-难以测试:当构造函数包含参数时,我可以轻松测试它并且我知道会发生什么(自动记录)。
有没有人有任何建议或意见?