加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 存储库层中的服务层重复功能

发布时间:2020-12-16 06:21:55 所属栏目:asp.Net 来源:网络整理
导读:我有一个ASP.NET MVC应用程序,我正在使用存储库模式,特定于服务的存储库.我发现我的设置开始感觉非常重复. 我的图层看起来像这样: UserController UserService UserRepository(存储库然后使用实体框架) 控制器接受构造函数中的服务以获得可测试性: public
我有一个ASP.NET MVC应用程序,我正在使用存储库模式,特定于服务的存储库.我发现我的设置开始感觉非常重复.

我的图层看起来像这样:
UserController> UserService> UserRepository(存储库然后使用实体框架)

控制器接受构造函数中的服务以获得可测试性:
public UserController(IUserService userService)

该服务接受存储库:
public UserService(IUserRepository)

用户可能能够更新其业务信息,更改其姓名,发送电子邮件,删除联系地址等.

所以我最终在服务中得到了这样的东西:

public class UserService {
    User CreateUser(....);
    User GetUserById(int id);
    void UpdateUser(User user);
    void DeleteUser(User user);
    Business CreateBusiness(...);
    Business GetBusinessById(int businessId);
    void UpdateBusiness(Business business);
    void DeleteBusiness(Business business);
    IEnumerable<Business> GetBusinessesByUserId();
    IEnumerable<BusinessType> GetBusinessTypes();
    ...
    ...
    ...

这些函数中的每一个都在存储库层中调用这样的函数:

public class UserRepository {
    User CreateUser(....);
    User GetUserById(int id);
    void UpdateUser(User user);
    void DeleteUser(User user);
    Business CreateBusiness(...);
    Business GetBusinessById(int businessId);
    void UpdateBusiness(Business business);
    void DeleteBusiness(Business business);
    IEnumerable<Business> GetBusinessesByUserId();
    IEnumerable<BusinessType> GetBusinessTypes();
    ...
    ...
    ...

每当我需要进行任何类型的CRUD /数据访问操作时,我发现自己在做以下事情:

>将操作添加到存储库的界面
>实现和编码存储库功能
>将操作添加到服务层的界面
>实现并编写服务函数以调用上述存储库函数

这变得很麻烦,尤其是当存在与特定服务/存储库相关的多个实体时.在整个应用程序中乘以多个存储库和服务……

为了背景,我放弃了通用存储库,以避免将多个存储库左右注入服务和/或控制器构造函数(或单个服务函数)的复杂性.

我似乎在违反DRY,不断重复自己.这是我能得到的接近,还是有更有效的方法来做到这一点?谢谢.

解决方法

第一.服务层不应重复存储库功能.而不是UserService.UpdateUser函数,应该有UserService.UpdateBasicData,UserService.UpdatePassword获取用户对象字段的子集.通常不应在服务中公开ORM层对象.用户对象肯定有许多属性,UpdateUser函数不应该更改它们,所以它不应该误认为服务使用者,它可能会改变它们.

第二.您仍然可以使用通用存储库并进行存储库聚合以进行注入.例:

public class UserRelatedRepositories : IUserRelatedRepositories {
    IRepository<User> User { get; set; }
    IRepository<Business> Business { get; set; }
}

然后使用

UserRelatedRepositories.User.Create()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读