1

我有以下操作:

public ActionResult ProductList(int category)
{
    IEnumerable<Product> productList = repository.Products.Where(p => p.CategoryId == category);
    return PartialView("ProductList", productList);
}

public ActionResult CategoryList(int parentCategory)
{
    IEnumerable<Category> categoryList = repository.Categories.Where(p => p.ParentCategoryId == parentCategory);
    return PartialView("CategoryList", categoryList);
}

构建以下部分视图:

@model POS.Domain.Entities.Product

<div class = "item">
    <h3>@Model.Name</h3>
    @Model.Description
    @Model.Category.Name
    <h4>@Model.Price.ToString("c")</h4>
</div>

@model POS.Domain.Entities.Category

<div class = "category" id= "@Model.CategoryId">
    <h2>@Model.Name</h2>
    <a href='/get-partial-view'>Get Products from the category: @Model.Name </a>
    <div class="divResult">
    </div>
</div>

并通过以下单元测试进行测试:

[TestMethod]
public void ProductListReturnsAppropriateProducts()
{
    // Arrange - create a controller
    var controller = new ProductController(_mockRepository.Object);

    // Action
    var result = (PartialViewResult) controller.ProductList(2);

    // Assert
    Assert.AreEqual(((IEnumerable<Product>) result.ViewData.Model).Count(), 2);
    Assert.IsTrue(((IEnumerable<Product>) result.ViewData.Model).Count(o => o.Name == "P4") == 1);
}

[TestMethod]
public void CategoryListReturnsAppropriateCategories()
{
    // Arrange - create a controller
    var controller = new ProductController(_mockRepository.Object);

    // Action
    var result = (PartialViewResult) controller.CategoryList(2);

    // Assert
    Assert.AreEqual(((IEnumerable<Category>) result.ViewData.Model).Count(), 3);
    Assert.IsTrue(((IEnumerable<Category>) result.ViewData.Model).Count(o => o.Name == "C4") == 1);
}

这几乎是完全的重复——我想学习更紧密地遵守DRY原则。

我的操作几乎做同样的事情——除了我需要一个来生成产品列表和一个类别列表。. . (这最终用于生成列出类别的页面,用户可以单击以查看这些类别中的所有产品)。

必须有一种方法可以将这些几乎重复的方法合并为一种可以适当处理产品与类别的方法。我应该如何从拥有这两个单独的动作转变为拥有一个同时处理products和的动作categories

4

1 回答 1

7

你把 DRY 有点过分了..这是样板代码是的..但它处理不同的实体,应该保持分开。

通过将它们组合在一起,您将打破单一责任原则。如果您需要更改其中一个的工作方式,则不必更改与另一个相关的任何内容。

于 2012-07-20T15:13:41.527 回答