拥有存储库模式,在控制器中可以执行:
public class ProductController : Controller {
private IUow Uow;
public ProductController(IUow uow) {
Uow = uow;
}
[HttpGet]
public ActionResult Edit(int id) {
ViewData.Model = Uow.Products.Get(id);
return View();
}
[HttpPost]
public RedirectToRouteResult Edit(int id, ProductEditBindingModel model) {
if (ModelState.IsValid) {
Uow.Products.Update(id, model);
}
return RedirectToAction("Edit");
}
}
简化示例
没关系,但是当你的业务逻辑有点复杂时会发生什么?假设使用工作单元或其他逻辑中的各种方法。
例如,假设我们需要: 审核编辑,更新基础索引,为用户添加分数以更新产品,将更新发布到用户的“墙”,无论您能想象到什么。
使用大量代码填充控制器感觉不对(而且我确定不是),所以我觉得使用像以下商业模式一样自然:
[HttpPost]
public RedirectToRouteResult Edit(int id, ProductEditBindingModel model) {
if (ModelState.IsValid) {
Model.UpdateProduct(id, model);
}
return RedirectToAction("Edit");
}
该模型需要访问Uow,因此我认为Model应该类似于:
public class ProductModel {
private IUow Uow;
public ProductModel(IUow uow) {
Uow = uow;
}
public void UpdateProduct(int id, ProductEditBindingModel model) {
// all logic with access to the Unit of Work.
}
}
和产品控制器如:
public class ProductController : Controller {
private IUow Uow;
private ProductModel Model;
ProductController(IUow uow) {
Uow = uow;
ProductModel = new ProductModel(uow);
}
....
}
这可以吗?有一件事是ProductController现在依赖于ProductModel,所以我认为创建一个接口(IProductModel)并注入依赖是明智的,但这意味着ProductController的构造函数需要接收IUow和IProductModel。当您需要访问多个模型时会发生什么?为该控制器创建一个模型,可以提醒我复制代码。在Controller dependecy上使用多个模型“看起来很好”,但有些东西让我觉得有一个关键概念或我遗失的“事物”。
我想知道的另一件事是,如果我们想要坚持一个模式,在一个简单的获取场景中,我可以做Uow.Products.Get(id)
但有时我会直接访问Uow而其他人则是模型。总是像ProductModel.Get(id)
那样访问模型是明智的吗?
我不想决定何时需要访问模型以及何时需要使用存储库。看起来像是一个不能很好地扩展的坏策略。
我想到的另一个选择是将Repository用作模型,但我很快就放弃了,因为ProductRepository不知道UserRepository,因此必须与两者交互的逻辑不适合。
我也不喜欢访问UserRepository的ProductModel的想法,这让我回到控制器执行所有“硬”工作,我知道这很糟糕。
我希望你了解我的情况,我试着尽我所能描述。 问题是:我应该如何管理MVC中的Uow / Repository模式中的复杂操作,以及管理负责调用的BusinessLogic模型的正确位置以及访问多个存储库的复杂操作的位置,访问等。
答案 0 :(得分:0)
我认为你的方法几乎没问题。名称ProductModel
表明它是一个模型,因此它不应包含任何业务逻辑。您需要创建ProductRepository
来处理ProductModel
的业务逻辑。
看看this article。这里的类Student
是模型,StudentRepository
处理业务逻辑。