创建可以传递给不同层的对象的正确方法是什么

时间:2012-05-11 19:39:58

标签: c# oop

我是编程新手,很遗憾我不清楚事情

我创建了一个让我们说的课程

public class Users 
{
   public int ID { get; set; }
}

我的第一个问题是我应该把这个课程放在3层设计中

如果我把它放在Business layer中,当我需要更新数据访问层时,我想将Users对象传递给Data access layer这样

sendDataToDB(List<Users);

在数据访问层,VS会为我生成这个方法

public static void sendDataToDB(List<global::BLL.Users> newUsers)
{

}

但是会有错误说:

  

在全局中找不到类型或命名空间名称“BLL”   命名空间(您是否缺少程序集引用?)

现在我只需创建另一个包含Users对象的库,并为所有三个图层提供对该库的访问权限。

我真的不认为这是做事的正确方法。所以任何建议都会很棒

3 个答案:

答案 0 :(得分:0)

如果您的User对象只包含数据且没有任何行为,则它似乎是捆绑与用户相关的数据的数据对象。在这种情况下,它是一个数据对象,可以跨层传递。你可以为它创建一个单独的命名空间甚至程序集。

请参阅:http://en.wikipedia.org/wiki/Data_Transfer_Object

答案 1 :(得分:0)

分层规则是较低层不能知道更高层。对于要查看特定类的所有三个层,它必须位于最低层。这通常意味着数据访问层 - “用户”可能更关注业务问题。

图层的另一个问题是,您通常不会传递较低层对其上层的依赖关系(至少是对其他图层的依赖关系)。例如依赖于数据层的业务层通常会将数据层与业务层的数据层隔离开来......

这实际上意味着需要在所有层之间共享的类应该在三层之外。

我建议使用Business类和Data类。业务层知道如何获取Data类并将其转换为更高层的业务类。例如您可能拥有用于查询/更新数据库中数据的Data.Users。 Business层使用它来查询/更新到数据库并将其转换为Business.Users,然后将其提供给更高层......

一些有用的分层交互规则:http://msdn.microsoft.com/en-us/library/ee658109.aspx#Step5

答案 2 :(得分:0)

这是一个非常好的问题,其中一个问题我仍然认为“这是2012年,为什么这仍然很难?”。

因此,您有一个3层解决方案:用户界面,域/业务逻辑,数据/持久性。在理想的世界中,您希望能够在UI中显示User类,在BL中定义User类及其逻辑,并能够将其传递到数据存储库以保存到数据库中。不幸的是,由于循环依赖,你不能用3层做到这一点。

一个常见的解决方案是使用像AutoMapper之类的东西,这样每个层都有它自己的(例如)User类的版本,你只需在层中的相似对象之间进行映射。像AutoMapper这样的工具允许将复杂域模型映射到更简单的UI显示类型类。域对象(即使它是由其他对象组成)然后可以映射到它特定存储库所需的对象类型 - 再次使用AutoMapper(顺便说一下,您不必使用AutoMapper,它只会减少映射无光泽)。

另一个选择是可能会突破三个层,并为每个“垂直”层提供第四个“水平”'DTO'层。我倾向于映射它们。

EF的新版本将EF创建的类一直放到UI视图中,但这对我来说感觉不对,并不是我所知道的,但可能适合你?

我相信其他人也会有其他建议。我会兴趣地看这个。