我创建了具有三层的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,我看到了两个选项:
我可以为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方法和IRepository注入ViewModel IServiceCRUD的其余部分。
-
这样,您的视图模型将依赖于IService和IRepository。两者都是视图模型所依赖的抽象。因此,视图模型不依赖于MSSQL实现等细节。考虑到MVVM体系结构模式,IService和IRepository都属于该模型,视图模型可以依赖于它们。
-
如果您的服务中有一个透明的方法,那么对于存储库中方法的每一次更改,您都必须修改IRepository、IService和service。这会降低你的开发效率。
顺便说一句,我更愿意将IRepository从DataAccess移到DomainLogic。这样做时,域将不依赖于数据访问,但数据访问将依赖于域。