如何在带有依赖项注入的3层应用程序中维护DRY规则



我创建了具有三层的WPF应用程序:DataAccess、DomainLogic和Views。DataAccess包含基于MSSQL数据库和DomainLogic层的一些ModelData的带有Add、Edit、Remove GetOne和GetAll方法的IRepository和Repository。DomainLogic包含GetAll方法的一些附加逻辑,因此它包含IService接口和Service类。在服务类构造函数中,我像这样注入IRepository:

private readonly IRepository _repository;
public Service(IRepository repository)
{
_repository = repository ?? throw new ArgumentNullException("repository");
}

现在我想在ViewModel中使用我的ModelData。GetAll应该来自Service,但其他方法应该来自Repository,我看到了两个选项:

  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);
    }
    

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

选项1显然是更好的

我可以为GetAll方法和IRepository注入ViewModel IServiceCRUD的其余部分。

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

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

顺便说一句,我更愿意将IRepository从DataAccess移到DomainLogic。这样做时,域将不依赖于数据访问,但数据访问将依赖于域。

最新更新