0

我是编程新手,很抱歉我不清楚

我创建了一个类让说

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

我的第一个问题是根据 3 层设计我应该把这门课放在哪里

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

sendDataToDB(List<Users);

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

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

}

但是会有错误说:

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

现在我只是创建另一个包含用户对象的库,并让所有三层都访问该库。

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

4

3 回答 3

0

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

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

于 2012-05-11T19:47:02.847 回答
0

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

层的另一个问题是您通常不会将较低层具有的依赖关系传递给它的上层(至少对其他层的依赖关系)。例如,依赖于数据层的业务层一般将数据层与业务层相关的层屏蔽掉……

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

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

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

于 2012-05-11T20:36:15.023 回答
0

这是一个非常好的问题,也是我仍然认为“现在是 2012 年,为什么这仍然如此困难?”的问题之一。

因此,您有一个 3 层解决方案:用户界面、域/业务逻辑、数据/持久性。在理想情况下,您希望能够在 UI 中显示您的用户类,在 BL 中定义用户类及其逻辑,并能够将其传递到数据存储库以保存到数据库中。不幸的是,由于循环依赖关系,您不能使用 3 层来执行此操作。

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

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

新版本的 EF 将 EF 创建的类一直放入 UI 视图中,但这对我来说是错误的,不是我所知道的,但可能对你有用?

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

于 2012-05-11T21:32:38.283 回答