Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建可以传递到不同层的对象的正确方法是什么_C#_Oop - Fatal编程技术网

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

C# 创建可以传递到不同层的对象的正确方法是什么,c#,oop,C#,Oop,我是编程新手,很抱歉我不太清楚 我创建了一个类 public class Users { public int ID { get; set; } } 我的第一个问题是,根据三层设计,我应该把这门课放在哪里 如果我把它放在业务层,当我需要更新数据访问层时,我希望像这样将用户对象传递到数据访问层 sendDataToDB(List<Users); sendDataToDB(List如果您的用户对象只包含数据而没有行为,那么它似乎是一个数据对象,捆绑了与用户相关的数据。在这种情况下,

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

我创建了一个类

public class Users 
{
   public int ID { get; set; }
}
我的第一个问题是,根据三层设计,我应该把这门课放在哪里

如果我把它放在
业务层
,当我需要更新数据访问层时,我希望像这样将用户对象传递到
数据访问层

sendDataToDB(List<Users);

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


请参阅:

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

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

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

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


一些有用的分层交互规则:

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

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

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

另一个选择是,可能分为三个层,在每个“垂直”层上“水平”提供第四个“DTO”层

EF的新版本将EF创建的类一直放在UI视图中,但我觉得这不对,这不是我所知道的,但可能对您有用


我相信其他人也会有其他建议。我会饶有兴趣地观看这部电影。

所以有一个包含对象的程序集是有意义的吗?是的,对象只包含数据,没有其他。一个“层”仅依赖于相邻的较低层。与业务和UI共享的数据类意味着数据、业务和UI不再是“层”.@PeterRitchie DateTime类是否违反层?DateTime不在任何层中声明;它是一个内在类型,因此您可以在需要时使用它。为了清楚起见,您可以在层之外添加任何您喜欢的基础结构类型…您已将其标记为三层,但在详细信息中讨论层。层和层是不同的你说的是层次还是层次?我只是删除层次,我说的是层次。谢谢彼得
public static void sendDataToDB(List<global::BLL.Users> newUsers)
{

}