首页 > 解决方案 > 干净架构中的存储库模式不违反依赖倒置原则吗?

问题描述

根据我所阅读和看到的干净架构假设您有一些实体对持久性一无所知,尽管在它们所在的同一层可能有一个接口,其目的是成为关于如何读取/更新实体的合同/删除。

// project Core
public class CarModel
{
    public string Name { get; set; }

    public void SomeImportantBehavior {}
}

public interface ICarModelRepository 
{
    CarModel FindByName(string name);
    CarModel Add(CarModel carModel);
}

同时另一层将保存接口的实现:

// project Infrastructure or Persistence
public class CarModelRepository : ICarModelRepository
{
    public CarModel FindByName(string name)
    {
        return new CarModel { Name = name }; // the implementation is not really important here
    }

    public CarModel Add(CarModel carModel) {
        // somehow persist it here
        return carModel;
    }
}

所以我有一个问题:存储库的实现不违反 DiP 原则吗?因为它不仅取决于抽象,还取决于具体实现(CarModel在这种情况下)?

另一个例子是here

PSCarModel是具有行为的域模型。

标签: c#oopdesign-patterns.net-coreclean-architecture

解决方案


您缺少一点依赖倒置原则。这个原则应该反映不同模块之间的解耦。换句话说,您不应该在需要它们的地方实例化您的对象,而是将它们作为参数接收。这是依赖注入的基本原则。

为了清楚起见,让我们假设您有一个Controller使用您的Repository. 如果没有 DI,起初它看起来像这样:

class Controller
{
    private CarModelRepository _repository;

    public Controller()
    {
        _repository = new CarModelRepository();
    }

    public void DoSomething()
    {
        //use repository here
    }
}

查看该类的构造函数,您可以看到它通过以下方式创建了自己的依赖项

_repository = new CarModelRepository();

在这种情况下,Controller包含对具体的依赖项CarModelRepository

如果您想应用依赖倒置原则,那么您将删除那里的实例化并将依赖项作为抽象注入。在这种情况下,控制器将如下所示:

class Controller
{
    private ICarModelRepository _repository;

    public Controller(ICarModelRepository repository)
    {
        _repository = repository;
    }

    public void DoSomething()
    {
        //use repository here
    }
}

请注意,现在存储库是ICarModelRepository接口,不再是具体类型,并且Controller不会创建它(作为具体依赖项),而是将其作为抽象依赖项(接口)接收。

这是依赖倒置原则含义的一个示例,在您的情况下,您不是将依赖项发送到存储库,而是发送需要保存的对象。代表应用程序模块的对象是您应该将其视为依赖项并注入它们的东西,就像存储库的情况一样。您的域对象不是要注入的依赖项,因此回答您的问题:

存储库实现不违反 DiP 原则吗?

不,它没有。


推荐阅读