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

Dav*_*vid 5 structuremap inheritance 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(); }
}
Run Code Online (Sandbox Code Playgroud)

现在,有一些存储库可供所有处理器使用,因此我做了一个基类,如下所示:

public class BaseProcessor
{
    protected ICommonRepository _commonRepository;
    public BaseProcessor(ICommonRepository commonRepository)
    {
        _commonRepository = commonRepository;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我的其他处理器继承自该处理器时,每个处理器都会收到一个编译器错误,说没有BaseProcessor的构造函数,该构造函数采用零参数。

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

Jos*_*gan 4

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

  • 不……那会走上一条糟糕的道路。仅仅因为您对构造函数参数的数量感到不舒服就强制指定服务位置?请不要。如果您有许多常见的依赖项(不仅仅是一个),那么也许您有一些常见的功能应该分解到另一个服务中。该服务将接受多个依赖项并执行需要它们的工作。然后,您可以将该服务注入到其他构造函数中。这就是“优先组合而不是继承”的含义。 (2认同)