我想创建一个asp.net应用程序,它有几个层(经典层设计):业务层和表示层。数据层似乎已经过时,因为EF可以完成所有工作。
因此,当我在业务层中创建EF模型时,我无法在表示层中使用实体,因为我无法为显示和验证等添加数据注释(尤其是显示属性通常是表示层的一部分)。对于我来说,将所有数据复制到表示层中类似的“viewmodel”类似乎不太好。
那么有一种很好的方法可以在业务层中创建对象上下文并为实体创建共享的“契约” - 组件吗?我发现的大多数样品都放在一个装配体中,在我看来,这不是更复杂应用的最佳方法。
答案 0 :(得分:4)
您应该从业务层抽象EF,不要直接使用此类框架。我通常会创建一个通用存储库接口和一个实现接口的通用EF存储库(这是您的数据层)。 IoC框架将在运行时注入正确的实现。
此外,您正在描述表示层中ViewModel的需求。它们只负责在视图中显示您需要的信息以及基于数据注释的验证。在开始时,它们看起来可能与您的域实体重复,但最终它将为您节省很多麻烦,这绝对是最佳选择。
您的业务层应该会产生域实体,在控制器中将它们映射到ViewModel。您可以使用AutoMapper。
您可以查看this question并回答有关服务/业务层和域/视图模型的更多信息。
答案 1 :(得分:2)
你可以拥有这样的图层。
您可以在EF模型层中创建部分类 - 用于数据注释和所有。因此它可以反过来 - 也将用于业务层。
答案 2 :(得分:1)
创建与您的实体完全相同的数据转换对象(DTO),但它们只具有简单属性。然后使用automapper在实体和DTO之间进行映射。
答案 3 :(得分: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.Service示例
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 Layer