ASP.NET MVC - 我想我错了

Sam*_*Sam 2 service repository-pattern asp.net-mvc-2

或者我根本不明白这一点.

我使用Controller - > ViewModel - > Service - > Repository模式启动了我的ASP.NET MVC应用程序.

每种类型的对象(客户,产品,类别,发票等)是否需要拥有自己的存储库和服务?如果是这样,你如何将常见物品放在一起?

我的意思是很多时候,其中一些东西会显示在同一页面上.所以我没有得到这个,我不认为.

所以我想我需要一个ShopController,它有一个ShopViewModel,可以有类别,子类,产品等等.但对我来说,问题是它似乎没有很好地融合.

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

编辑

所以汇总包括:

Product,SubCategory,Product,ChildProduct,ProductReview,Product是聚合根?

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

我正在使用实体框架4,那么如何使用存储库/服务模式实现延迟加载?

Mar*_*man 6

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

您的域中每个聚合根应该有一个存储库.有关什么是聚合根的更多信息,请参阅此问题.

在您提供的示例中,我可以看到CustomerReposiotry将处理检索所有相关客户数据(客户订单下订单有客户).处理检索产品信息的ProductRepository.

和服务?如果是这样,你如何将常见物品放在一起?

服务层很好,但只有在添加此层时有附加值.如果您的服务只是直接进入存储库,则可能不需要它.但是,如果您需要在Product上执行某些业务逻辑,则ProductService可能有意义.

这可能没有意义

public void UpdateProduct(Product product)
{
  _repo.Update(product);
}
Run Code Online (Sandbox Code Playgroud)

但是如果你有逻辑,那么这个层就可以封装你的产品业务规则.

public void UpdateProduct(Product productToUpdate)
{
  //Perform some sort of business on the productToUpdate, raise domain events, ....
  _repo.Update(productToUpdate);
}
Run Code Online (Sandbox Code Playgroud)

所以我想我需要一个ShopController,它有一个ShopViewModel,可以有类别,子类,产品等等.但对我来说,问题是它似乎没有很好地融合.

如果域被刷新,则视图模型最终会有意义

public ActionResult Index()
{
  ShopViewModel shopViewModel = new ShopViewModel();
  shopViewModel.Products = _productRepo.GetAll();
  //other stuff on the view model.
  return(shopViewModel);
}
Run Code Online (Sandbox Code Playgroud)

更新

当您还需要提供从聚合根无法获得的数据时会发生什么?例如,假设我有一个创建客户视图,并且在该视图中,我还需要向用户提供可供选择的公司集合以将新客户与之关联.公司集合是来自CustomerRepository还是您还需要CompanyRepository?

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

_repo.GetAllCompanyNames();
Run Code Online (Sandbox Code Playgroud)