在我的域中,我有一些“处理器”类,它们拥有大部分业务逻辑。使用带有默认约定的StructureMap,我将存储库注入其各种IO(数据库,文件系统等)的类中。例如:
public interface IHelloWorldProcessor
{
string HelloWorld();
}
public class HelloWorldProcessor : IHelloWorldProcessor
{
private IDBRepository _dbRepository;
public HelloWorldProcessor(IDBRepository dbRepository)
{
_dbRepository = dbrepository;
}
public string HelloWorld(){ return _dbRepository.GetHelloWorld(); }
}
现在,我希望所有处理器都可以使用一些存储库,所以我创建了一个这样的基类:
public class BaseProcessor
{
protected ICommonRepository _commonRepository;
public BaseProcessor(ICommonRepository commonRepository)
{
_commonRepository = commonRepository;
}
}
但是当我的其他处理器继承它时,我在每个处理器上都会遇到一个编译器错误,说没有BaseProcessor的构造函数接受零参数。
有没有办法做我想在这里做的事情?也就是说,要将一个公共依赖项注入到我的其他类可以使用的基类中,而不必将注入写入每个类中?
答案 0 :(得分:4)
没有。这是C#语言要求,而不是StructureMap限制。派生类必须将值传递给其基础构造函数。如果您仅使用基类来处理注入公共服务,那么您无法获得任何东西。只需将公共服务放在需要它的每个类上 - 您的IoC工具将负责它 - 它有什么危害吗?
答案 1 :(得分:2)
你想要的是财产注入。基类具有注入依赖项的公共属性是可以的,因为您永远不会将派生类用作基类的具体实例 - 您将(应该)始终使用派生类的接口。
这里的答案是避免构造函数注入中的这个明显的弱点,并在基类上使用属性注入。