服务层足够动态,允许应用程序发送查询/过滤器
本文关键字:应用程序 查询 过滤器 动态 服务 | 更新日期: 2023-09-27 18:08:25
我们设置了数据访问层,以使用存储库、服务和规范(用于预定义查询)。在持久化数据时,服务层接收在持久化之前被转换为实际实体的dto。当请求数据时,我们要么得到一个DTO,要么得到一组DTO。应用层只知道dto。它不了解实际的实体。
所以一个服务和接口可能看起来像这样:
public class UserService: IUserService
{
IUserRepository _repository;
public UserService(IUserRepository repository)
{
_repository = repository
}
public UserDto GetByUsernameAndPassword(string username, string password)
{
return _repository.Find(UserSpecifications.MatchByUsernameAndPassword(username,password));
}
}
public interface IUserService: IBaseService<UserDto>
{
public UserDto GetByUsernameAndPassword(string username, string password);
}
最近我需要允许应用层生成一个查询传递到服务层。传递一个字符串来查找索引或单个字段是相当容易的,但是当我们想要在使用多个字段的实体上执行排序、过滤和搜索时,这对我来说就变得令人困惑了。
这里有几个场景:
假设我们在应用程序上有一个网格控件。该控件允许我们对多个字段进行排序。我们需要将排序表达式传递给服务,将该表达式转换为要传递给存储库的实体属性列表。存储库知道如何处理实体集合上的多种排序。
B。应用程序允许用户基于DTO中的字段构造查询。DTO看起来像这样:
public class UserDto
{
string Username {get;set;}
string FirstName {get;set;}
string LastName {get;set;}
AddressDto Address{get;set;}
}
查询将以一种用户可以选择字段和提供术语的方式构建://这是用户如何在系统中编写查询的一个示例。其中用户名与"A"和地址。City = "Myrtle Beach"
所以我们可以有一个表达式发送给Service:
u => u.Username.StartsWith("A") && u.Address.City == "Myrtle Beach"
我正在想办法把这些想法转化为服务的最佳方式。还有其他人做过类似的事吗?
我曾考虑过应用程序从服务中过滤结果,但我担心的是结果集可能很大。我只想通过存储库从数据库中带回需要的东西。
我最终使用Lucene作为我的索引。