StructureMap - 将依赖项注入基类?

时间:2010-05-27 15:56:52

标签: inheritance structuremap constructor

在我的域中,我有一些“处理器”类,它们拥有大部分业务逻辑。使用带有默认约定的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的构造函数接受零参数。

有没有办法做我想在这里做的事情?也就是说,要将一个公共依赖项注入到我的其他类可以使用的基类中,而不必将注入写入每个类中?

2 个答案:

答案 0 :(得分:4)

没有。这是C#语言要求,而不是StructureMap限制。派生类必须将值传递给其基础构造函数。如果您仅使用基类来处理注入公共服务,那么您无法获得任何东西。只需将公共服务放在需要它的每个类上 - 您的IoC工具将负责它 - 它有什么危害吗?

答案 1 :(得分:2)

你想要的是财产注入。基类具有注入依赖项的公共属性是可以的,因为您永远不会将派生类用作基类的具体实例 - 您将(应该)始终使用派生类的接口。

这里的答案是避免构造函数注入中的这个明显的弱点,并在基类上使用属性注入。