首页 > 解决方案 > 如何使用依赖注入在 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 个选项可以做到这一点:

  1. 我可以为 GetAll 方法注入 ViewModel IService,为其余的 CRUD 注入 IRepository。

  2. 仅将 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);
    }
    

哪一种方法更好,或者也许还有其他方法可以更好地实现我的目标?

标签: c#dependency-injection

解决方案


选项1显然更好

我可以为 GetAll 方法注入 ViewModel IService,为其余的 CRUD 注入 IRepository。

  1. 这样,您的视图模型将依赖于 IService 和 IRepository。两者都是您的视图模型所依赖的抽象。因此,您的视图模型不依赖于 MSSQL 实现等细节。考虑到 MVVM 架构模式,IService 和 IRepository 都属于模型,视图模型依赖它们是可以的。

  2. 如果您的服务中有一个透明的方法,那么对于存储库中方法的每次更改,您都必须修改 IRepository、IService 和 Service。这会降低你的开发效率。

附带说明一下,我更愿意将 IRepository 从 DataAccess 移动到 DomainLogic。以这种方式完成时,域将不依赖于数据访问,但数据访问将依赖于域。


推荐阅读