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