我有一个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,不断重复自己。这是我能得到的接近,还是有更有效的方法来做到这一点?感谢。
答案 0 :(得分:4)
<强>首先。服务层不应重复存储库功能。而不是UserService.UpdateUser
功能,应该UserService.UpdateBasicData
,UserService.UpdatePassword
获取User
个对象字段的子集。通常不应在服务中公开ORM层对象。 User
对象肯定有很多属性,而UpdateUser
函数不应该更改它们,因此它不应该误认为服务使用者,它可能会改变它们。
<强>二。您仍然可以使用通用存储库并进行存储库聚合以进行注入。例如:
public class UserRelatedRepositories : IUserRelatedRepositories {
IRepository<User> User { get; set; }
IRepository<Business> Business { get; set; }
}
然后使用
UserRelatedRepositories.User.Create()