Model应该在哪里使用Uow和Repository Pattern

时间:2013-12-28 22:54:26

标签: asp.net-mvc repository-pattern unit-of-work

拥有存储库模式,在控制器中可以执行:

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模型的正确位置以及访问多个存储库的复杂操作的位置,访问等。

1 个答案:

答案 0 :(得分:0)

我认为你的方法几乎没问题。名称ProductModel表明它是一个模型,因此它不应包含任何业务逻辑。您需要创建ProductRepository来处理ProductModel的业务逻辑。

看看this article。这里的类Student是模型,StudentRepository处理业务逻辑。