c# - 干净架构中的存储库模式不违反依赖倒置原则吗?
问题描述
根据我所阅读和看到的干净架构假设您有一些实体对持久性一无所知,尽管在它们所在的同一层可能有一个接口,其目的是成为关于如何读取/更新实体的合同/删除。
// 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
是具有行为的域模型。
解决方案
您缺少一点依赖倒置原则。这个原则应该反映不同模块之间的解耦。换句话说,您不应该在需要它们的地方实例化您的对象,而是将它们作为参数接收。这是依赖注入的基本原则。
为了清楚起见,让我们假设您有一个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 原则吗?
不,它没有。
推荐阅读
- html - 如何在中间元素滚动时保持左右 flex 元素(侧边栏)固定,滚动条在右侧?
- eclipse - pydev 无法识别未来的注释
- vue.js - Vuejs条件类使用计算
- css - CSS Flex Row 和 Table / Table Cell 有一些问题
- amazon-web-services - 使用媒体转换设置分段持续时间
- python - PyQt5:当 QMessageBox 作为菜单操作从 QSystemTrayIcon 调用时,QApplication 意外退出
- python - 从二维 numpy 数组中提取任意小计
- php - PHP在重定向时丢失PHPSESSID cookie中的会话ID
- python - python/pandas : Pandas 更改值,在值中添加额外的数字
- javascript - 如何从 Node 中的 TensorFlow.js 获取最可能的类名