我已经阅读了几本关于MVC的书籍和文章,并且遇到了存储库模式和服务层。
控制器是否能够通过存储库模式获取实体,还是必须从服务层检索数据?
编辑:我在服务层中有代码如下所示
public UserInfo GetModel(int userInfoID)
{
return userInfoRepo.Get(userInfoID);
}
public UserInfo GetUserByPortalID(string portalID)
{
return userInfoRepo.GetByPortalID(portalID);
}
public UserInfo GetModelByUserName(string username)
{
return userInfoRepo.GetByUserName(username);
}
如果服务中的方法只调用存储库中的另一个方法,是否需要让控制器通过该服务?
答案 0 :(得分:11)
在分层应用程序架构中,有一条基本规则,即绝不能绕过图层。如果直接从控制器查询存储库,则会违反该规则。
你可能会说什么?。 如果服务层没有添加任何值,该怎么办?那么,将来可能会......
您可以选择违反规则,但则不再是分层应用。这可能也没关系 - 还有其他好的(甚至更好的)应用程序架构可用,但我认为首先你应该对整体架构做出决定,然后你坚持这个决定。否则你最终会得到意大利面条代码 - 当它是分层应用程序时我们称之为 lasagna :)
答案 1 :(得分:4)
这取决于。如果您计划将来有复杂的业务规则,我会添加服务层。如果您的站点仅在服务层中使用很少或没有逻辑的CRUD操作,则可以直接调用存储库层。
答案 2 :(得分:2)
控制器是否能够通过存储库模式获取实体,或者必须从服务层检索数据。
理想情况下,控制器应仅使用本身依赖于一个或多个存储库的服务层,以便将一个或多个简单的CRUD操作聚合到业务操作中。有些情况虽然在简单的应用程序中您可能不需要服务层并且控制器直接使用存储库。
答案 3 :(得分:2)
总是一个问题是什么更适合你,你的风格是什么。至于我,我更喜欢从控制器动作访问服务层。然后,该服务将访问存储库模型。
public class UserController : MyServiceController<UserServices>
{
public ActionResult GetUser(int id)
{
var user = Service.GetUser(id);
return View(user);
}
}
public class UserServices : MyServices<User>
{
public User GetUser(int userId)
{
return Repository.Single(a=>a.Id == userId);
}
}