【问题标题】:How to populate a combobox using 3-tier architecture如何使用 3 层架构填充组合框
【发布时间】:2016-03-26 13:22:12
【问题描述】:

我正在编写一个使用 3 层的应用程序。

在表示层,我有一个组合框,我需要用一个简单的 SQL 来填充它,例如

SELECT distinct(Item) as items From ItemsTable order by items;

AFAIK,表示层不应该知道项目列的名称。也许名称将在 DB 中更改,我不想更新整个应用程序,在最坏的情况下只有 DAL。

我的问题是如何在不写列(项目)名称的情况下填充组合框

ItemsComboBox.DisplayMember = "items";
ItemsComboBox.DataSource = _businessLayer.GetListOfItems();

业务层:

public DataTable GetListOfItems()
    {
        return DataAccess.Instance.Retrieve("TableName", "items");
    }

【问题讨论】:

  • 业务层中分配给该元素的名称是什么?,?

标签: c# winforms data-access-layer n-tier-architecture 3-tier


【解决方案1】:
_businessLayer.GetListOfItems();
  • 业务层应该查询数据层而不是数据库。
  • 如果数据库发生变化,只有数据层会受到影响。

最好是创建一个不会改变和使用它的商业实体

如果您不想手动创建它们,可以使用AutoMapper 之类的工具。

你可以参考MSDN

【讨论】:

    【解决方案2】:

    您应该专门为业务层和表示层之间的数据传输定义一个类。这称为数据传输对象。对 DTO 类中的属性重用与实体中的列名相同的命名不会有什么坏处。您的业​​务层方法将从数据库中获取数据,填充 DTO 并将其返回给表示层中的调用方法。相同的对象可用于传回数据。如果实体中的列名称发生变化,您可以在业务层修改数据库访问,而不会影响表示层。 Bob Tabor 在 youtube 上有一些关于应用程序架构的精彩视频。他解释得很好。

    【讨论】:

    • 根据您的解释,以下可以解决吗?数据表 dataTable = _items.GetListOfItems(); ItemsComboBox.DisplayMember = dataTable.Columns[0].ColumnName; ItemsComboBox.DataSource = dataTable;
    • 是的,您可以为 DTO 使用数据表。
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 2019-08-04
    • 2017-05-10
    • 2015-06-16
    • 2021-04-25
    • 2014-07-29
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多