2

我们有一个分层应用,或至少是在转换到一个,过程细分如下:需要咨询关于层状溶液,关注点分离等

  • 接口(用户界面或应用程序 - 接口,即web服务等)
  • 业务逻辑
  • 数据访问

为了使这个问题的其余部分更具体,我将描述一个具体的实例。

我们有一个用户界面,它有一个控制器对象(业务逻辑层)。该控制器通过另一个对象(数据访问层)与数据库通信。

在给定的上下文中,用户界面允许用户选择一名员工以将正在执行的操作绑定到。由于有关于用户(当然,控制器真的以外的任何世界),可以挑选员工的规则,该控制器提供了这样两两件事:

  • 包含可用的员工名单一个可读的属性从
  • 选择
  • 读/写包含当前选择的员工

用户界面可以阅读列表,并使用它来填充组合框属性。

在本申请的第1版中,组合框包含雇员的标识号+员工的姓名。

一切都很好...

...直到版本1.1,一个错误修正。用户抱怨他不能在Jimmy OlsonJimmy Olson之间选择,因为该应用程序不能让他很容易知道哪个是哪个。他知道销售部门有一个Jimmy,开发部门有另一个Jimmy,所以这个1.1版本的解决方案是简单地在组合框中加上斜杠+部门名称。在版本2中,我们将选择使用支持列的组合框替换组合框,删除斜杠,但在1.1中,为了最大限度地减少进一步错误的风险,选择了这种方法。

换句话说,组合框将包含:

  • 1 - 吉米·奥尔森/销售
  • 2 - 吉米·奥尔森/开发
    • 别人

但是,用户界面代码没有SQL代码或任何获取方式对该部门的控制,因此我们必须去控制器并查看那里的代码。控制器不需要部门,老实说,它甚至不需要员工的姓名,识别号码就足够了,因此控制器中没有任何要求或对部门做任何事情。所以我们必须下到数据访问层并在那里更改SQL。

这个解决方案很坦率地闻到。

如果有多个接口到该控制器,具有不同的要求,我们有三个可能的解决方案:

  1. 更改数据访问层,以迎合(增加/多样)的多个接口需求(2层客场),这意味着所有的接口将可能获得他们所需要的数据,但他们也将获得所有所需的任何其他接口的
  2. 添加的东西,让用户界面告诉数据访问层的数据(仍在2层以外)它需要什么
  3. 不知何故使用户界面la你可以在不改变涉及的控制器或访问层的情况下获得所需的数据,这听起来像我们需要更多的数据访问代码。

以上解决方案的感觉很好。

我想知道是,我们是完全偏离航向?你会如何做到这一点?在上述3以下是否有第四个和第五个解决方案?

每一个问题:Separation of Concerns,公认的答案包含了这句话:

关注分离是保持代码为每个这些问题分开。更改界面不应该要求更改业务逻辑代码,反之亦然。

这是否仅仅意味着所有控制器/数据访问层应该为我们提供的是执行其工作所需的任何内容(即员工的识别号码),然后用户界面应该与数据库并询问有关这些特定员工的更多信息

回答

1

我看到它的方式,你有两种可能性:

  1. 有较低层发送了所有 的信息,他们对一个 人,可能是一个XML文档, 尽管许多的消费者 ,该信息并不需要这一切。
  2. 提供API,为更高层次的 层向下钻取并获得他们所需要的信息 。所以,在你给 情况下,有 接口可以要求企业 层问数据库层的 给定的用户ID的部门法。

两个有取舍。第一个提供了更多的信息,可能是那些没有这些信息权利的消费者。第二个通过每个交易的信息少得多,但需要更多的交易。每当你有更多的信息时,第一个不需要改变API,但改变了XML。第二个保持现有API的界面相同,但随需求变化提供新的API。等等。

+0

对,这些都对我感觉不错。例如,如果我们只发送控制器需要的东西,就像你说的那样,我们需要一种方式来说“好吧,我需要更多”,并且这必须尽可能地精益,而不是执行一个sql每个员工... – 2008-11-18 18:37:07