5

我有一个 3 层应用程序

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

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

List<Person> 

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

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

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

4

3 回答 3

3

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

在此处输入图像描述

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

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

以下片段构成了服务层的非常基本的示例。我没有包括其他细节,例如 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 分离。

于 2014-05-18T04:58:30.457 回答
1

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

于 2014-05-18T04:16:36.220 回答
1

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

现在考虑一个具有 100 到 1,000 个实体的真实应用程序。这种模式不能很好地扩展。

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

于 2014-05-17T12:09:26.847 回答