我正在学习ASP.NET存储库模式。我做了一些研究,找不到正确的答案。
我的DAL上有一个数据库实体Employee,它具有许多列。
我有EmployeeRepository,负责使用DBContext查询数据。
现在我在服务层上有了EmployeeService,它需要为员工返回一个DTO,也就是说,它只有几个字段(名字,姓氏,出生日期)。
现在,如果我从EmployeeRepository中以IQueryable的形式获取Employees列表,并在我的服务层上将它们选择为EmployeeDTO,我将通过允许服务层访问数据库来违反该规则。
如果不是,则EmployeeRepository会将每个雇员的所有数据作为列表返回到服务层,以便服务层仅选择几个字段来创建EmployeeDTO。但是,通过这种方法,我将加载不需要的所有数据。
我想知道是否有人提出建议。
亲切的问候,
最佳答案
当我开始学习时,我也有类似的困惑。
现在,如果我从EmployeeRepository获得雇员列表,则为
IQueryable,然后在我的服务层上将它们选择为EmployeeDTO
通过启用服务层访问
数据库。
您的理解是正确的。存储库不应公开IQueryable,而应仅返回数据。
如果不是,则EmployeeRepository将返回每个的所有数据
员工将服务层作为列表,以便该服务层
仅选择几个字段来创建EmployeeDTO。但是用这种方法
我将加载不需要的所有数据。
这实际上是基于您的需求和您的应用程序需求。方法声明及其应如何返回没有严格的规则。
从下面的内容中,我可以理解两件事:“将每个员工的所有数据返回给服务层”。
无论员工是什么,您都将所有数据返回给服务层。产品,然后您将获得员工所需的产品。
如果是这种情况,则可以限制使用参数
或者您的意思是关于要返回的对象属性。这是基于从存储库到服务层的DTO。您可以根据需要定义自己的DTO。为此,我的建议是,如果您可以为Db和DTO保留单独的对象,那么它将使您的系统变得复杂并且难以维护。将数据公开给用户时,请保留必要的单独对象。
实施范例
Dotnet-Repository-Pattern-Template-With-Unit-Of-Work
在该示例中,使用了三层。
api-向用户公开数据
BL-服务层-处理所有业务逻辑并处理CRUD的存储库
持久性-处理持久性-封装大型/复杂查询。