我有一个 3 层应用程序
DAL 有 EDMX 文件,EF6 从数据库自动生成它(DB First 模式)。我也有 BLL 和 UL 层。
但是,当我想在 UI 中使用 BLL 方法时,我必须将 DAL 程序集添加到 UI 层(因为方法的返回类型)
List<Person>
人在 EDMX (DAL) 中定义] (这是我的问题)
如何从 EDMX 文件中分离类 (DTO) 并创建为单独的程序集?
如何防止将 DAL 程序集(整个 EDMX)添加到 UI 层?
我有一个 3 层应用程序
DAL 有 EDMX 文件,EF6 从数据库自动生成它(DB First 模式)。我也有 BLL 和 UL 层。
但是,当我想在 UI 中使用 BLL 方法时,我必须将 DAL 程序集添加到 UI 层(因为方法的返回类型)
List<Person>
人在 EDMX (DAL) 中定义] (这是我的问题)
如何从 EDMX 文件中分离类 (DTO) 并创建为单独的程序集?
如何防止将 DAL 程序集(整个 EDMX)添加到 UI 层?
这就是我要做的。要将 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 分离。
只需将 POCO 的 TT 文件移动到不同的项目,并将 EDMX TT 文件留在 DAL 中。这样你就可以在他们自己的模型项目中基本上拥有 DTO/POCO,并且可以在任何需要的地方引用它。
好问题,公认的智慧是您为每个层/层(DAL、BLL 和 UI)定义一个不同的人,然后编写代码在每个层之间进行映射。有AutoMapper可以让生活更轻松。
现在考虑一个具有 100 到 1,000 个实体的真实应用程序。这种模式不能很好地扩展。
我建议对 EF使用Code First方法。并在所有层之间传递相同的对象。