繁体   English   中英

服务层是否足够动态以允许应用程序通过查询/过滤器发送?

[英]Service Layer dynamic enough to allow for application to send over queries / filters?

我们具有数据访问层设置,以使用存储库,服务和规范(用于预定义的查询)。 服务层在保留数据时会采用DTO,这些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;}
}

查询将以用户可以选择字段并提供术语的方式构造://这是用户如何在系统中编写查询的示例。 用户名SartsWith“ A” AND Address.City =“ Myrtle Beach”

因此,我们可能会有一个表达式发送给服务:

u => u.Username.StartsWith("A") && u.Address.City == "Myrtle Beach"

我正在尝试找出在服务中转换其中一些想法的最佳方法。 还有其他人做过这样的事情吗?

我曾考虑过应用程序从服务中过滤结果,但我担心的是结果集可能很大。 我只想通过存储库取回数据库中需要的内容。

我最终选择了Lucene作为索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM