这是一个令人尴尬的基本 n 层问题。
我在 VS2008 中使用亚音速创建了一个 DAL 项目。它有一个小部件类、一个小部件集合类和一个小部件控制器类。
我创建了引用它的业务逻辑项目(不,我不能把它放在同一层)。使用特定的业务标准,它在返回小部件集合的函数中选择小部件集合。
我的问题是:我的 GUI 层如何将集合绑定到网格?我知道小部件集合是数据网格的有效数据源,但是GUI 层如何知道小部件和小部件集合是什么?当然,我不必从 GUI 中引用 DAL,这否定了整个观点。
这是一个令人尴尬的基本 n 层问题。
我在 VS2008 中使用亚音速创建了一个 DAL 项目。它有一个小部件类、一个小部件集合类和一个小部件控制器类。
我创建了引用它的业务逻辑项目(不,我不能把它放在同一层)。使用特定的业务标准,它在返回小部件集合的函数中选择小部件集合。
我的问题是:我的 GUI 层如何将集合绑定到网格?我知道小部件集合是数据网格的有效数据源,但是GUI 层如何知道小部件和小部件集合是什么?当然,我不必从 GUI 中引用 DAL,这否定了整个观点。
(使用 SubSonic 2.x)在我的 BLL 类中,我有一个属性,它提供了对相关 DAL 类的对象引用。我的 UI 表单引用了 BLL 类,因此我可以从表单中通过 .BLL.DAL.xxxx 处理 DAL 属性和方法
FWIW,我从未成功地将 SubSonic 集合绑定到 DataGridView。作为替代方案,我有时使用集合 .ToTable() 方法创建一个 DataTable,然后绑定到它,或者我使用 .AddRow() 手动绑定
查看 MSDN 中 IBindingList 接口的文档,它有一个非常好的示例。例如,在模型中创建一个使用 BLL 中的 Customer 类的 CustomersList 类。将网格绑定到 CustomersList 类的一个实例。表示层不知道亚音速表类。
您可能需要使用接口。您可以轻松地基于 Dal 中的 Widget 创建一个界面(右键单击该类并从该类创建一个界面)。接下来获取接口并将其添加到您的业务逻辑层或仅用于接口的单独项目中。完成后,您可以在 DAL 和 GUI 中添加对接口的引用。如果您曾经将数据存储从数据库更改为 XML 等,这也会有所帮助。
首先,我不认为这是一个令人尴尬的基本 n 层问题。这是一个非常有趣的主题,我试图在旧的 Subsonic 论坛中引发讨论。
我和你一样不愿意将我的 GUI 层暴露给 DAL。
我的 GUI 层只使用我自己的实体模型的词汇和主题与 BLL 对话,并且只返回我自己的实体或列表,或者在某些情况下返回数据表。
我的 BLL 只与一个映射层对话,该层将 Fetches、Saves 等映射到适当的 DAL CRUD 方法,并将返回的 Subsonic 类型转换为我的实体类型。
在这样做的过程中,我对我必须复制多少 Subsonic 感到惊讶,有时我觉得我走错了路,我现在感觉更舒服了,尽管它仍然需要重构和改进。
例如,找到一种灵活、通用的方法来向我的 BLL 指示我希望在 fetch 中返回哪些行是一个我没有预料到的挑战,我完成了一个具有流畅接口的通用查询类,它看起来很像亚音速选择。
FWIW,我认为您正朝着正确的方向前进,我想您要做的就是决定如何将这些 Subsonic 类型定义到您的 GUI。
Rob 有一个您可能感兴趣的有趣讨论。