6

我想创建一个具有多个层(经典层设计)的 asp.net 应用程序:一个业务层和一个表示层。数据层似乎已经过时,因为 EF 完成了所有工作。

因此,当我在业务层创建 EF 模型时,我无法使用表示层中的实体,因为我无法为显示和验证等添加数据注释(尤其是显示属性通常是表示层的一部分)。对我来说,将所有数据复制到表示层中类似的“viewmodel”类似乎不太好。

那么有没有一种好的方法可以在业务层中创建对象上下文并为实体提供共享的“合同”组件?我发现的大多数示例都将所有内容放在一个组件中,在我看来,这不是更复杂应用程序的最佳方法。

4

4 回答 4

5

您应该将 EF 从业务层中抽象出来,切勿直接使用此类框架。我通常会创建一个通用存储库接口和一个实现该接口的通用 EF 存储库(这是您的数据层)。IoC 框架将负责在运行时注入正确的实现。

此外,您准确地描述了表示层中 ViewModel 的需求。他们只负责在视图上显示您需要的信息以及基于数据注释的验证。一开始它们可能看起来像您的域实体的副本,但最终它会为您省去很多麻烦,这绝对是要走的路。

您的业​​务层应该生成域实体,在您的控制器中将它们映射到您的 ViewModel。您可以为此使用AutoMapper 。

您可以查看此问题和答案以获取有关服务/业务层和域/视图模型的更多信息。

于 2013-10-01T07:23:00.817 回答
2

你可以有这样的层。

  1. EF模型层项目
  2. 业务层,将与 EF 模型交互
  3. 表示层,与业务层交互,如果需要也可以参考EF模型

您可以在 EF 模型层中创建部分类 - 用于数据注释等。所以它可以反过来 - 也将用于业务层。

于 2013-10-01T06:42:02.800 回答
1

创建与您的实体完全相同的数据转换对象 (DTO),但它们仅具有简单属性。然后使用automapper在 Entities 和 DTO 之间进行映射。

于 2013-10-01T07:35:03.563 回答
0

在这里,我有一个很好的建议给你。

首先将您的应用程序划分为层

**SM.MVCApp**  :-  This is for MVC application 
**SM.Service** :- This layer is for holding the business logic (Interface & Class)
**SM.Data**    :- This layer is to interact with database using Entity framework (Repository & UOW)  
**SM.Entity**  :- This layer is responsible for having property in class that will be mapping with the table of database.

SM.服务示例

public interface IStudent
{
    IQueryable<Entity.Student> GetAllStudent();

    Student GetStudentByID(Int32 StudentID);

    void CreateStudent(Student objStudent);

    void UpdateStudent(Student objStudent);

    void DeleteStudentvoid(Student objStudent);

    void SaveChanges();

    List<Entity.Student> SearchStudent(string Name, int Age, string EmailAddress, string CountryName);

    void MakeRelation(Entity.StudentCourceMap objMap);
}

现在展示如何创建 SM.Data 层

  1. 首先创建用于创建数据库和表的 DBContext 类
  2. 然后为 crud 操作创建 IRepository * Repository 类
  3. 然后创建 UOW(工作单元)
于 2013-10-01T08:23:18.667 回答