Inheritance StructureMap-将依赖项注入基类?

Inheritance StructureMap-将依赖项注入基类?,inheritance,structuremap,constructor,Inheritance,Structuremap,Constructor,在我的领域中,我有一些“处理器”类,它们持有大部分业务逻辑。使用带有默认约定的StructureMap,我将存储库注入到这些类中,用于它们的各种IO(数据库、文件系统等)。例如: public interface IHelloWorldProcessor { string HelloWorld(); } public class HelloWorldProcessor : IHelloWorldProcessor { private IDBRepository _dbReposi

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


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

否。这是C语言的要求,而不是结构图的限制。派生类必须将值传递给其基构造函数。如果您仅使用基类来处理注入公共服务,那么您将一无所获。只需将公共服务放在每个需要它的类上—您的IoC工具会处理它—有什么害处?

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


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

我想这没有什么真正的危害,我只是想稍微整合一下。让代码变得更干净就是一切。现在的权衡是要么在每个类的构造函数中包含公共依赖项,要么在基类中手动实例化依赖项(调用ObjectFactory.GetInstance(),而不需要构造函数参数)。我想是时候把我的IoC容器抽象出来了,让第二个选项更舒服一点:)不。。。那将是一条不好的道路。仅仅因为您对构造函数参数的数量感到不舒服而强制服务位置?请不要。如果您有许多共同的依赖项(不仅仅是一个),那么您可能有一些共同的功能,这些功能应该被分解到另一个服务中。该服务将接受多个依赖项并执行需要它们的工作。然后将该服务注入到其他构造函数中。这就是“偏爱组合而不是继承”的意思。如果他出于建模的原因有一个公共基类,我会同意你的看法。但他正在创建一个“人工”基类,其唯一目的是接收依赖项。无论财产注入与否,这都不会带来任何好处。