【问题标题】:Separate data from UI layer?将数据与 UI 层分离?
【发布时间】:2012-09-26 16:09:36
【问题描述】:

我想将data layerUI Layer 完全分开。这是我的例子,我有一些客户需要为同一份报告提供不同的数据,我不希望UI 接触Data Layer,所以我假设我需要在Data Layer 之间添加一些“东西”和UI。基本上,UI 会调用一些“事物”,而那个“事物”会调用 Data layer,然后 data layer 会根据用户检索数据并将其传递回“事物”和“事物”会将数据传回给UI

我不知道这个“东西”应该是什么?

我听说过一些术语,例如模型,使用对象映射器,但不确定这些术语是否相关。

【问题讨论】:

  • 您所描述的通常称为“业务逻辑”层
  • @paul - 我明白了,但是使用我的场景最好的方法是什么?

标签: c# winforms design-patterns .net-4.0 data-access-layer


【解决方案1】:

您正在寻找的模式是 MVC - 模型-控制器-视图。您需要的“东西”是控制器。通常代码是这样组织的

  • 调用控制器获取报告
  • 是访问数据层(或模型)并获取一个填充了数据的对象(可以是强类型对象,或者只是一个地图)
  • 控制器调用视图,将数据对象传递给它并获取渲染结果
  • 控制器将渲染结果返回给客户端。

这应该足以让您入门。

MVC pattern in wikipedia

【讨论】:

  • 这是否适用于 MVVM 模型,如果适用,如何?
  • 在 MVVM 中,控制器被替换为“视图模型”层,该层将数据从模型转换为视图可以理解的格式。另外,据我所知,MVVM 使用事件而不是直接方法调用,因此 View-Model 层只是公开(或使用)事件,只知道事件签名,而不是将控制器绑定到视图和模型。
【解决方案2】:

您说的是一种通用架构:UI --> 业务逻辑层 (BLL) --> 数据访问层 (DLL)。现在,BLL 和 DAL 可以包含在您的 .exe 中(您使用 WinForms 标记了您的问题),或者可以成为服务层/层的一部分,这很常见。

拥有定义每一层(BLL 和 DLL)的接口通常是一种很好的做法。这将允许您在不影响其使用者(通常)的情况下更改层的实现,为您提供关注点分离,并促进测试。

BLL 将包含您的逻辑,而 DAL 将管理您的数据源。您提到了一个模型,它通常指的是 DAL 通过 BLL 返回的对象。将其视为您的 Person 模型或 Order 模型。由于您的标签是 Winforms,您可能需要研究 MVP 模式。

【讨论】:

  • 这是否适用于 MVVM 模型,如果适用,如何?
  • 可以,但一般来说,我项目中的 BLL 和 DLL 驻留在服务/存储库层中。我认为您希望避免您的 ViewModel(或 MVP 中的演示者)成为代理代码隐藏文件。在 MVVM 中,我将 ViewModel 调用到存储库或服务层,然后再调用 DAL。
  • 您能解释一下什么是存储库或服务层吗?
  • 从客户端,使用这些来调用您的 Web 服务或 BLL。通常,您希望您的 ViewModel/Presenter/Controller 将请求传递给其中之一 - 它更多的是 SRP/关注点分离。这些将调用获取数据等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2022-11-23
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多