Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC3设计-存储库模式和服务层_Asp.net Mvc_Design Patterns_Service_Repository - Fatal编程技术网

Asp.net mvc MVC3设计-存储库模式和服务层

Asp.net mvc MVC3设计-存储库模式和服务层,asp.net-mvc,design-patterns,service,repository,Asp.net Mvc,Design Patterns,Service,Repository,我读了几本关于MVC的书和文章,并了解了存储库模式和服务层 控制器应该能够通过存储库模式获取实体,还是必须从服务层检索数据 编辑:我在服务层中有如下代码 public UserInfo GetModel(int userInfoID) { return userInfoRepo.Get(userInfoID); } public UserInfo GetUserByPortalID(string portalID) { return userInfoRepo.GetByPort

我读了几本关于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);
}
如果服务中的一个方法只调用存储库中的另一个方法,那么有必要让控制器检查该服务吗

控制器应该能够通过存储库模式获取实体,还是必须从服务层检索数据


理想情况下,控制器应该只使用服务层,服务层本身依赖于一个或多个存储库,以便将一个或多个简单的CRUD操作聚合到业务操作中。但在一些简单的应用程序中,您可能不需要服务层,而让控制器直接使用存储库。

什么更适合您以及您的风格始终是一个问题。至于我,我更喜欢从控制器操作访问服务层。然后服务将访问存储库模型

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);
    }
}
公共类用户控制器:MyServiceController
{
公共操作结果GetUser(int id)
{
var user=Service.GetUser(id);
返回视图(用户);
}
}
公共类UserServices:MyServices
{
公共用户GetUser(int userId)
{
返回Repository.Single(a=>a.Id==userId);
}
}

视情况而定。如果您计划将来有复杂的业务规则,我会添加服务层。如果您的站点只执行CRUD操作,而在服务层中几乎没有逻辑,那么您可以直接调用存储库层

在分层应用程序体系结构中,有一条基本规则规定,决不能绕过层。如果直接从控制器查询存储库,则违反了该规则

那又怎样?你可以说。如果服务层没有增加价值怎么办?好吧,也许将来


您可以选择打破规则,但这样它就不再是分层应用程序了。这可能也没关系-还有其他好的(甚至更好的)应用程序体系结构可用,但我认为首先您应该就总体体系结构做出决定,然后您必须坚持这个决定。否则,您将得到意大利面代码——当它是分层应用程序时,我们称之为千层面:)

我不确定我是否同意您的看法。即使只有两层,它仍然是一个分层应用程序。将其视为LayerDD应用程序的最小层数是多少?决定其是否分层的不是层数,而是是否绕过违反规则的层。是的,只有两层,要从另一层绕过其中一层有点困难。