c# - 如何使用依赖注入在 3 层应用程序中维护 DRY 规则?
问题描述
我创建了具有 3 层的 WPF 应用程序:DataAccess、DomainLogic 和 Views。DataAccess 包含 IRepository 和 Repository 以及基于 MSSQL 数据库的 Add、Edit、Remove GetOne 和 GetAll 方法以及来自 DomainLogic 层的一些 ModelData。DomainLogic 包含 GetAll 方法的一些附加逻辑,因此它包含 IService 接口和 Service 类。在 Service 类构造函数中,我像这样注入 IRepository:
private readonly IRepository _repository;
public Service(IRepository repository)
{
_repository = repository ?? throw new ArgumentNullException("repository");
}
现在我想在 ViewModel 中使用我的 ModelData。GetAll 应该来自 Service,但其余方法应该来自 Repository,我看到 2 个选项可以做到这一点:
我可以为 GetAll 方法注入 ViewModel IService,为其余的 CRUD 注入 IRepository。
仅将 IService 注入 ViewModel 并在 Service 中实现某种透明方法,例如:
public void Add(ModelData Model) { _repository.Add(Model); } public void Edit(ModelData Model) { _repository.Edit(Model); } public void Remove(int id) { _repository.Remove(id); }
哪一种方法更好,或者也许还有其他方法可以更好地实现我的目标?
解决方案
选项1显然更好
我可以为 GetAll 方法注入 ViewModel IService,为其余的 CRUD 注入 IRepository。
这样,您的视图模型将依赖于 IService 和 IRepository。两者都是您的视图模型所依赖的抽象。因此,您的视图模型不依赖于 MSSQL 实现等细节。考虑到 MVVM 架构模式,IService 和 IRepository 都属于模型,视图模型依赖它们是可以的。
如果您的服务中有一个透明的方法,那么对于存储库中方法的每次更改,您都必须修改 IRepository、IService 和 Service。这会降低你的开发效率。
附带说明一下,我更愿意将 IRepository 从 DataAccess 移动到 DomainLogic。以这种方式完成时,域将不依赖于数据访问,但数据访问将依赖于域。
推荐阅读
- django - 当我执行 PUT/PATCH 时,如何在不删除实际对象数据的情况下从多对多关系的实例表中删除对象
- php - PHP -> 如何在注册查询中绑定多个值?
- python - 如何在 django 模型中使用枚举作为选择字段
- excel - 使用 VBA 将行添加到表的现有范围
- go - 如何从登录将会话数据存储在 chi 路由器上下文中
- angular - 取消订阅连接的可观察对象的销毁
- rest - 使用类似过滤器的条件设计 rest API
- c# - 拆分列表
基于项目长度 - graphql - req 在 Apollo Server 上下文中始终未定义
- laravel - 正确的 if-else 分组 Laravel