如果我想显示数据库中的数据,是否应该在 BLL 项目类中创建与 DAL 项目中的 poco 类相同的类并将其返回到 UI 项目?

2024-01-22

我有一个架构问题。我有带有 poco 类(数据库中的等效表)的 DAL 项目、BLL 项目和 UI 项目。 UI项目引用了BLL项目,BLL项目引用了DAL项目。

我想在 UI 项目中显示数据,例如来自数据库中的表 Product 的数据。我应该在BLL项目类中创建与DAL项目中的poco类相同的类并将其返回到UI项目并显示它吗?

这是我在 DAL 中的 poco 类(数据库中的等效表):

public class Product 
{

    public int  ID  {get; set; }
    public string  Name   {get; set; }
    public String  Address {get; set; }
}

在 BLL 中,我创建了与上面的 poco 类相同的业务对象:

public class ProductBO
{
    public int ID { get; set; }
    public string Name { get; set; }
    public String Address { get; set; }
}

在 BLL 中,我还有从 DAL 获取产品并将它们映射到业务对象的方法 - ProductBO:

public class ProductService
{
    public List<ProductBO> GetAllProducts()
    {
        List<ProductBO> productsBO = new List<ProductBO>();

        using (var context = NorthwindFactory.CreateContext())
        {
            List<Product> products = context.Product.ToList();

            foreach (var product in products)
            {
                productsBO.Add(new ProductBO { ID = product.ID, Address = product.Address, Name = product.Name });
            }
        }

        return productsBO;
    }
}

现在,在控制器的 UI 项目中,我从返回 List 的 BLL 调用服务,并且在视图中我可以使用业务对象 ProductBO 显示数据。

@model IEnumerable<WebApplication1.BLL.BusinessObjects.ProductBO>

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Address)
        </th>
    </tr>
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Address)
        </td>
    </tr>
}
</table>

这是正确的架构方法吗?


嗯,没有单一正确方法。但我倾向于避免创建一组 DAL 类。现代 ORM 允许使用 POCO 类。是的,存在一些限制(例如枚举),但恕我直言,不值得为每个业务实体创建两个副本并在它们之间进行映射。因此,我选择位于业务逻辑组件中的单个 POCO 实体。实体框架与该实体一起保存并从数据库加载它。没有映射。

表示层是不同的。通常,同一实体在不同页面上有多种表示形式。您还可以使用不同的数据注释属性来设置对视图模型或某些 UIHint 的限制。这会用特定于 UI 的逻辑污染您的业务实体。此外,您经常需要显示格式化或修改后的数据,例如 Person 实体的 FullName 而不是 FirstName 和 LastName。因此,这里我不使用 POCO 业务实体,而是创建视图模型。

对于您的产品样本,此方法将如下所示:

  • 业务逻辑组件有 POCO 实体Product
  • 持久性程序集引用业务逻辑程序集并使用相同的Product
  • UI项目有不同的视图模型ProductViewModel, BriefProductViewModel等等。它还负责之间的映射Product并查看模型。注意 - 手动映射非常耗时。我建议您使用一些映射库,例如 AutoMapper 或 ValueInjecter
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果我想显示数据库中的数据,是否应该在 BLL 项目类中创建与 DAL 项目中的 poco 类相同的类并将其返回到 UI 项目? 的相关文章

随机推荐