Asp.net mvc 2 ASP.NETMVC-我想我是做错了

Asp.net mvc 2 ASP.NETMVC-我想我是做错了,asp.net-mvc-2,service,repository-pattern,Asp.net Mvc 2,Service,Repository Pattern,或者我一点也不明白 我已经使用控制器-->视图模型-->服务-->存储库模式启动了ASP.NET MVC应用程序 是否每种类型的对象(客户、产品、类别、发票等)都需要有自己的存储库和服务?如果是,您如何将常见项目组合在一起 我的意思是,很多时候,这些东西中的一些会显示在同一页上。所以我不明白,我不认为 所以我想我需要一个ShopController,它有一个ShopViewModel,它可以有类别、子类别、产品等等。但对我来说,问题是它似乎并不匹配 也许ASP.NET WebForms适合像我这

或者我一点也不明白

我已经使用控制器-->视图模型-->服务-->存储库模式启动了ASP.NET MVC应用程序

是否每种类型的对象(客户、产品、类别、发票等)都需要有自己的存储库和服务?如果是,您如何将常见项目组合在一起

我的意思是,很多时候,这些东西中的一些会显示在同一页上。所以我不明白,我不认为

所以我想我需要一个ShopController,它有一个ShopViewModel,它可以有类别、子类别、产品等等。但对我来说,问题是它似乎并不匹配

也许ASP.NET WebForms适合像我这样的人:)

编辑

那么,一个聚合将包括以下内容:

类别、子类别、产品、子产品、ProductReview,产品是否为聚合根

然后在ViewModels中,您将访问该产品以获取其子产品、评论等


我使用的是entity framework 4,那么如何使用存储库/服务模式实现延迟加载呢?

您可以向控制器传递多种类型的存储库(我假设您使用某种IoC容器和构造函数注入)。然后,您可以决定从所有传递的存储库组成某种类型的服务对象

每种类型的对象(客户、, 产品、类别、发票等) 需要有自己的存储库

在域中,每个聚合根都应该有一个存储库。有关什么是聚合根的更多信息,请参见本文

在您给出的示例中,我可以看到一个CustomerReposiotry,它将处理和检索所有相关的客户数据(customer has orders a order has customer)。处理检索产品信息的ProductRepository

服务呢?如果是的话,你如何带来 共同的项目在一起

服务层很好,但只有在添加该层时才有附加值。如果您的服务只是直接进入存储库,则可能不需要它。然而,如果您需要在产品上执行某些业务逻辑,那么ProductService可能是有意义的

这可能没有道理

public void UpdateProduct(Product product)
{
  _repo.Update(product);
}
但是,如果您有逻辑,那么这一层对于封装产品的业务规则是有意义的

public void UpdateProduct(Product productToUpdate)
{
  //Perform some sort of business on the productToUpdate, raise domain events, ....
  _repo.Update(productToUpdate);
}
所以我想我需要一个 ShopController,它有一个 ShopViewModel,它可能 类别、子类别、产品、, 但对我来说,问题是 只是看起来不太合拍

如果域被清除,视图模型就有意义了

public ActionResult Index()
{
  ShopViewModel shopViewModel = new ShopViewModel();
  shopViewModel.Products = _productRepo.GetAll();
  //other stuff on the view model.
  return(shopViewModel);
}
更新


当你也需要的时候会发生什么 提供从数据库无法获取的数据 聚合根?比如说我 在中创建客户视图和 鉴于此,我还需要提供 具有要访问的公司集合的用户 从中选择以关联新的 顾客。收集 公司来自客户存储库 或者你还需要一个 公司报告

如果一家公司可以独立生存(例如,您编辑、更新、删除一家公司),我建议该公司也是您域的聚合根(客户有一家公司,公司有一个客户列表)。但是,如果一家公司只能通过客户获得,我会将该公司视为ValueType/价值对象。如果是这种情况,我将在客户存储库上创建一个方法来检索所有CompanyNames

_repo.GetAllCompanyNames();

存储库是不可或缺的,随它们去吧。它们隐藏了数据实现。与ORM一起使用时,您几乎可以忘记核心数据库活动(CRUD)。您会发现,通常在对象和存储库之间有1:1的映射,但是没有什么可以阻止存储库返回它喜欢的任何东西。通常情况下,您将根据实例执行操作。为查询创建非对象特定的存储库,这些存储库自然不适合现有的查询

您将在it的“服务”部分发现许多相互冲突的论点——有些人喜欢将其分为域服务(我称之为不适合核心域对象的业务规则)和应用程序服务(域对象上操作的逻辑分组)。实际上,我已经完成了一个名为[ProjectName].Core.Operations的独立项目,该项目位于我的[ProjectName].Core解决方案文件夹中。核心+操作=域

一个操作可能会返回一个DTO,其中包含通过域上的许多存储库调用和操作生成的视图所需的所有信息。有些人(包括我自己)更喜欢从演示文稿中完全隐藏存储库,而使用操作(服务)作为它们的门面。只要按照直觉命名,不要害怕,重构是健康的。HomePageOperations类没有问题,方法GetEverythineEedfortheHomePageOperations返回一个ThingSineedFortheHomePageOperations类

让控制器尽可能轻。他们所做的只是将数据映射到视图,将视图映射到数据,与“服务”对话并处理应用程序流

下载并查看这些项目。后者确实展示了IMHO的良好架构


最后,别忘了分层的一个主要问题是可插拔性/可测试性,所以我建议您考虑一个好的IoC容器(我是Castle.Windsor的粉丝)。同样,S#arp体系结构是了解这一点的好地方。

您能否进一步解释您的问题?当您还需要提供无法从聚合根获取的数据时,会发生什么情况?例如,假设我有一个createcustomer视图,在该视图中,我还需要向用户提供一组公司,供其选择,以便将新客户与之关联。公司的集合是来自CustomerRepository还是您也需要一个CompanyRepository?请更新您的问题答案。@RUS您的对照中有两个不同的服务呼叫