我正在学习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的存储库
持久性-处理持久性-封装大型/复杂查询。

10-06 12:20
查看更多