【问题标题】:Practical way for separate Entity classses (DTO) from EDMX从 EDMX 分离实体类 (DTO) 的实用方法
【发布时间】:2014-05-17 12:00:53
【问题描述】:

我有一个 3 层应用程序

DAL 具有 EDMX 文件,EF6 从数据库自动生成它(DB First 模式)。 我也有 BLL 和 UL 层。

但是,当我想在 UI 中使用 BLL 方法时,我必须将 DAL 程序集添加到 UI 层(因为方法的返回类型)

List<Person> 

在 EDMX (DAL) 中定义的人] (这是我的问题)

如何我可以从 EDMX 文件中分离类 (DTO) 并创建为单独的程序集?

如何防止将 DAL 程序集(整个 EDMX)添加到 UI 层?

【问题讨论】:

    标签: c# entity-framework edmx three-tier


    【解决方案1】:

    这就是我要做的。要将 DAL 与 UI 分离,您将需要一个“中间层”。考虑下图。

    中间层被广泛称为服务层或应用层。

    每当Person 数据从一层传递到另一层时,它都会“映射”到该特定层的等效类。

    以下 sn-ps 构成了服务层的非常基本的示例。我没有包括其他细节,例如 AutoMappers 和其他一般做法。

    PersonDto,定义在中间层,代表Person 实体。

    public class PersonDto
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    

    PersonService 类。它封装了数据访问和业务逻辑,只返回PersonDto(而不是实体)。这是 UI 与域通信的方式。

    public class PersonService
    {
        public PersonDto GetPersonById(int id)
        {
             Person person = dbContext.Persons.Find(id);
             
             // Mapping in action.
             var personDto = new PersonDto()
             {
                 FirstName = person.FirstName,
                 LastName = person.LastName,
             };
    
             return personDto;
        }
    }
    

    这个PersonService是UI代码看到的,它不知道数据访问或业务逻辑。它只知道服务。

    服务应该封装您的业务逻辑,将 UI 与 BLL 和 DAL 解耦。

    【讨论】:

    • UI 层中 Person 的更好模拟是 PersonViewModel,因为基于 MVVM 模式的 UI 层中 PersonModelPersonDTO
    【解决方案2】:

    好问题,公认的智慧是您为每个层/层(DAL、BLL 和 UI)定义不同的 Person,然后编写代码以在每个层之间进行映射。有AutoMapper可以让生活更轻松。

    现在考虑一个包含 100 到 1000 个实体的真实应用程序。这种模式不能很好地扩展。

    我建议对 EF 使用Code First 方法。并在所有层之间传递相同的对象。

    【讨论】:

    • 您是否有任何示例使用您建议的自动映射器实现这些层?
    • 不,我没有,因为这种模式不可扩展,我从不使用它。我敢肯定,如果您使用 google automapper,您可以找到示例。
    • 我会说相反的。具有 100 到 1000 个实体的现实应用程序最受益于使用同一对象的不同表示,因为这使得不同层彼此独立。但是,我不会创建一个包含 1000 个实体的单体应用程序,而是将其分成几个较小的应用程序。
    【解决方案3】:

    只需将 POCO 的 TT 文件移动到不同的项目,并将 EDMX TT 文件留在 DAL 中。这样一来,您就可以在自己的模型项目中拥有本质上的 DTO/POCO,并且可以在任何需要的地方引用。

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多