在应用程序的各层之间传输数据

时间:2013-12-08 01:34:55

标签: c#

如果我有一个带有5层架构的C#应用​​程序,就像这里提到的那样http://msdn.microsoft.com/en-us/library/ee658109.aspx,我采用严格的交互方法,允许图层只与下面的图层交互,我遇到了在我的数据层中获取数据并将该数据传回我的业务层时出现问题。

例如,如果我在业务层中定义了一个名为MyObject的业务对象,但是从数据层中的数据库中检索构建MyObject类型对象所需的信息,我的业务层需要引用我的数据层以便与数据库交互。但是,我的数据层还需要对Business层的引用,因为这是MyObject定义所在的位置,而Data层需要从数据库结果构造该类型的对象,并将该数据提供给Business层。现在,我们在业务层和数据层之间存在循环依赖关系。

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

我考虑过使用我的数据层中定义的DTO对象将信息传递回Business层。这可以工作,因为业务层能够与数据层交互,但反之亦然。看起来这可能是一个非常多的重复代码,基本上模仿了数据层中的业务对象定义。

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

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

2 个答案:

答案 0 :(得分:1)

听起来你会受益于AutoMapper。 https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

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

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

答案 1 :(得分:0)

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

另一种解决方案是从数据访问层返回原始结果,并从原始结果构建Business层中的对象。