BLL逻辑 - 数据访问模式

时间:2013-10-27 16:24:54

标签: design-patterns

我有这种情况(MVC + EF)

我在数据库中有两个表Category和Product。

最初,我为Category创建了一个BLL。 BBL有CRUD方法。

在D(删除)中。此方法将按ID删除类别。

因此。关于BBL类别的一切都已完成。

接下来,我为Product创建一个BLL。它也有CRUD方法。

在C(创建)视图中。我展示了一个HTML,这是一个产品类别列表。

我想问的问题是:

当我将Product BLL添加到我的项目中时。我必须修改Category BLL的Delete方法。

我有/想要将名为DeleteProductByCategoryID()的新方法添加到BBL。我在Category BLL的Delete方法中称之为。

public void Delete(int id)
{
xxxxx.DeleteProductByCategoryID(id);
categoryBLL.DeleteCategory(id);
}

该方法将删除指定类别ID的所有产品。

所以问题是:我应该在哪里创建DeleteProductByCategoryID()方法(类别或产品BLL)?

要在Controller.Product.Create()视图中显示Category列表,我还想创建一个新方法来获取Category的集合。我应该将此方法放在Product BLL或Category BLL中吗?

1 个答案:

答案 0 :(得分:0)

通常,产品(至少)有一个类别而不是其他类别。通过categoryId删除产品是否有意义(例如,当产品绑定到多个类别时)?

但无论如何,通常你不想创建硬依赖。

一种可能性是在产品数据库中创建复合关键表,其中包含 ProductId 的所有可能的 CategoryId 。这样,您就可以在Product和Category之间建立连接,但是您不会创建任何硬DB依赖项,因为该表仅包含值。这也简化了CRUD操作。通常,这样的复合表的命名方式如下: Entity1_has_Entity2

[Product_has_Category]
[ProductId] PK, NOT NULL
[CategoryId] PK, NOT NULL

填写第10,13和5类中的ProductId 1:

[1, 10]
[1, 13]
[1, 5]

在这种情况下,删除方法应该放在ProductBLL中,看起来像这样:

public void Delete(int id)
{
    // delete the _has_ relations - there is no connection between product and category anymore
    productBLL.DeleteCategoriesForProduct(id);
    productBLL.DeleteProduct(id);
}

ProductBLL中的 show 方法也很简单:

public void ShowCategoriesForProduct(int id)
{
    // from the _has_ relations table
    List<int> categoryIds = productBLL.CategoriesForProduct(id);
    foreach (int categoryId in categoryIds)
    {
        var categoryName = categoryBLL.CategoryInfo(categoryId).Name;
    }
}

我会把问题分类为数据库规范化而不是设计模式。关于数据库规范化的一个很好的例子可以在this article中找到。