【问题标题】:Transferring data between layers of an application在应用程序的层之间传输数据
【发布时间】:2013-12-08 01:34:54
【问题描述】:

如果我有一个具有 5 层架构的 C# 应用程序,就像这里介绍的 http://msdn.microsoft.com/en-us/library/ee658109.aspx,并且我采用严格的交互方法,允许一个层只与下面的层交互,我会遇到麻烦在我的数据层中获取数据并将该数据传回我的业务层。

例如,如果我的业务层中定义了一个名为 MyObject 的业务对象,但构建 MyObject 类型的对象所需的信息是从数据层的数据库中检索到的,那么我的业务层需要引用我的数据层为了与数据库进行交互。但是,我的数据层还需要对业务层的引用,因为这是 MyObject 定义所在的位置,并且数据层需要从数据库结果构造该类型的对象并将该数据返回给业务层。现在我们在业务层和数据层之间有了循环依赖。

我想知道解决这个问题的正确方法是什么。

我曾考虑使用在我的数据层中定义的 DTO 对象将信息传递回业务层。这会起作用,因为业务层能够与数据层交互,但反之则不行。看起来这可能是大量重复代码,以基本上模仿数据层中的业务对象定义。

我还考虑为我的所有业务对象创建接口,并将这些接口放入一个单独的项目中,业务层和数据层都可以与之交互。这样,我可以传递接口的实例,业务层和数据层之间唯一的共同引用是定义接口的项目。我也没有看到很多这样的实现。

我想知道其他人做了什么来解决这个问题。

【问题讨论】:

  • 显示您的代码并说明您遇到错误的地方。如果可能,请提供您的异常详细信息以及它来自哪一行
  • 嗯,这不完全是编码问题,而是设计/架构问题。我没有具体的例外,因为它更多的是关于如何解决循环项目依赖问题的技术问题。

标签: c#


【解决方案1】:

听起来您会从 AutoMapper 中受益。 https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

应用程序的每一层都应该有自己的“真相版本”。数据层具有基于数据存储格式形成的 POCO。然后,数据和业务层之间的接口应该采用这些数据 POCO 并将它们映射到业务 POCO。冲洗并重复业务/用户界面边界或您可能拥有的任何其他层。

在一个层中最能描述对象的数据形状不应决定另一层如何最好地描述一个对象。 (即数据层可能需要外键 id,但视图可以使用内存中的引用很好地完成。)

【讨论】:

  • 我过去曾在通过网络传输的 DTO 上使用过 AutoMapper,但我从未使用它在图层之间进行映射。不过,我喜欢你的建议,它似乎是最干净的解决方案。我唯一担心的是数据 POCO 和业务 POCO 将非常相似,我可能会从其他团队成员那里收到有关设计方法的问题,因为它需要两个对象表示大致相同的事物,而外键表示之类的事物可能只有很小的差异。感谢您的回答。
【解决方案2】:

如果需要在Data端构造数据,则在数据访问层定义类型。如果对象是在 DL 中构造的,那么这就是类型所属的地方。这使您可以避免循环引用。只需在业务层项目中引用Data项目,即可访问类型。

另一种解决方案是从数据访问层返回原始结果,并根据原始结果在业务层构造对象。

【讨论】:

  • 这是我正在考虑的方法之一,但在数据层中定义我的业务对象似乎有点奇怪......这已通过您的第二个建议解决。我在业务层中存在原始结果的问题似乎表明业务层必须具有对数据程序集的引用,我试图将其限制为仅数据层。我可能试图对此过于“纯粹”,并且不得不解决一些不那么“纯粹”的事情。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2010-12-23
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多