在 Entity Framework 和 C# 中使用两层、一个实体和另一个域的优点和缺点是什么?
What are the advantages and disadvantages of use two layers, one entities and other domain in Entity Framework and C#?
通常在C#中创建项目时,可以是MVC、ASP.NET等,正确的做法是创建不同的层,一般是层数据、表示、实体等
我在一些项目中看到Entity Framework只有一层实体(obj. from database),所有对数据库的操作都是在这些对象上进行的
但是在另一个项目中我看到了两层,一个域和其他实体。域层包含与实体层相同的对象,然后它们是另一个称为映射器的层,负责匹配来自实体的对象和来自域的对象。这里所有对数据库的操作都是在域对象上进行的
我的问题是:这两种构建项目的方式各有什么优缺点?
如果你的应用不复杂,更多的是CRUD性质,那么这个答案就没那么重要了。但是,如果您的业务领域很复杂,那么这很重要。
它与 separation of concern 有关并构建更强大的应用程序:
- 一层中的更改不应强制更改另一层。
- 一层中的设计decisions/constraints不应强加于其他层。
一个典型的例子是使用 Entity Framework 或其他 ORM 映射器。如果您要设计一个只关注业务领域的实体,那么它很可能会以一种方式查看(例如使用适当的 encapsulation 等)。但是从 Entity Framework 的角度来看,您会做出一些牺牲以允许 EF 跟踪和处理实体。
向用户展示一个实体时,您可能想要对其进行调整,例如打印 "n/a" 而不是 "null" 等。这些更改是为了使其更加 user/view 友好,也有牺牲
因此,我们创建了同一对象类型的多个表示,但针对不同的关注点(表示、业务逻辑和持久性),而不是获得一个试图擅长所有事情的单一实体。
但是,如果实体看起来完全一样,那么设计就不是很好。业务实体通常具有更好的面向对象设计,而 UI 和持久性实体更多的是 Data Transfer Objects
没有单一的灵丹妙药,它取决于多种因素。以下是我在两者之间做出决定时要注意的几个因素:
- 如果您的应用程序是像 WPF 这样的富客户端应用程序,并且应用程序的大小将从中等到大,那么请考虑使用单独的域层,因为您可能需要实现各种接口和标志以支持对 EF 毫无意义的绑定支持.
- 如果您的应用程序是 REST API,那么在实体和域中重复 类 并一直进行不必要的转换是没有意义的。一个Entity层就够了。
- 即使您的应用程序是富客户端应用程序,但如果您正在实现 MVVM 模式,那么单独的域层也没有意义,因为所有 UI 特定逻辑将进入 ViewModel 类。
简而言之,仅当您要在领域层中拥有一些附加功能时,才在领域层中复制 类,这样复制和转换的成本是合理的。
通常在C#中创建项目时,可以是MVC、ASP.NET等,正确的做法是创建不同的层,一般是层数据、表示、实体等
我在一些项目中看到Entity Framework只有一层实体(obj. from database),所有对数据库的操作都是在这些对象上进行的
但是在另一个项目中我看到了两层,一个域和其他实体。域层包含与实体层相同的对象,然后它们是另一个称为映射器的层,负责匹配来自实体的对象和来自域的对象。这里所有对数据库的操作都是在域对象上进行的
我的问题是:这两种构建项目的方式各有什么优缺点?
如果你的应用不复杂,更多的是CRUD性质,那么这个答案就没那么重要了。但是,如果您的业务领域很复杂,那么这很重要。
它与 separation of concern 有关并构建更强大的应用程序:
- 一层中的更改不应强制更改另一层。
- 一层中的设计decisions/constraints不应强加于其他层。
一个典型的例子是使用 Entity Framework 或其他 ORM 映射器。如果您要设计一个只关注业务领域的实体,那么它很可能会以一种方式查看(例如使用适当的 encapsulation 等)。但是从 Entity Framework 的角度来看,您会做出一些牺牲以允许 EF 跟踪和处理实体。
向用户展示一个实体时,您可能想要对其进行调整,例如打印 "n/a" 而不是 "null" 等。这些更改是为了使其更加 user/view 友好,也有牺牲
因此,我们创建了同一对象类型的多个表示,但针对不同的关注点(表示、业务逻辑和持久性),而不是获得一个试图擅长所有事情的单一实体。
但是,如果实体看起来完全一样,那么设计就不是很好。业务实体通常具有更好的面向对象设计,而 UI 和持久性实体更多的是 Data Transfer Objects
没有单一的灵丹妙药,它取决于多种因素。以下是我在两者之间做出决定时要注意的几个因素:
- 如果您的应用程序是像 WPF 这样的富客户端应用程序,并且应用程序的大小将从中等到大,那么请考虑使用单独的域层,因为您可能需要实现各种接口和标志以支持对 EF 毫无意义的绑定支持.
- 如果您的应用程序是 REST API,那么在实体和域中重复 类 并一直进行不必要的转换是没有意义的。一个Entity层就够了。
- 即使您的应用程序是富客户端应用程序,但如果您正在实现 MVVM 模式,那么单独的域层也没有意义,因为所有 UI 特定逻辑将进入 ViewModel 类。
简而言之,仅当您要在领域层中拥有一些附加功能时,才在领域层中复制 类,这样复制和转换的成本是合理的。