构建一个通用的过滤器参数输入接口

本文关键字:过滤器 参数 输入 接口 一个 构建 | 更新日期: 2023-09-27 18:08:13

我有接受不同输入的方法调用,即:

public Authors GetAuthors(string name, string sortBy, string sortDir, int startRow, int numRow)
{
    // Get authors based on filters
}
public Books GetBooks(string id, string year, string sortBy, string sorDir, int startRow, int numRow)
{
    // Get books based on filters
}

我打算改变它,使过滤器是对象,即:

public Authors GetAuthors(GetAuthorsFilters filters)
{
    // Get authors based on filters
}
public Books GetBooks(GetBooksFilters filters)
{
    // Get books based on filters
}

但是许多过滤器在方法中是常见的,我想为此构建一个通用接口(即IFilter),可以采用不同的过滤器对象,但不确定从哪里开始。有什么建议吗?

谢谢。

构建一个通用的过滤器参数输入接口

在我看来,我会使用抽象类来完成您正在寻找的内容。您可以为每种搜索类型创建一个接口,但随后必须每次都实现该接口,而且在BookFilters和AuthorFilters中的共享属性之间似乎没有编程差异。比如:

public abstract class BaseFilter
{
    public string SortBy { get; set; }
    public bool SortAscending { get; set; }
    public int RowStart { get; set; }
    public int RowCount { get; set; }
}
public class BookFilter : BaseFilter
{
    public string ISBN { get; set; }
    public int Year { get; set; }
}
public class AuthorFilter : BaseFilter
{
    public string Name { get; set; }
}

听起来您希望在所有过滤器之间共享一些功能。实现它的方式不一定是通过接口,而是通过抽象基类。另外,因为要过滤不同的对象,所以使用泛型是有意义的。您可以使用如下内容:

public class FilterBase<T> {
    protected int startRow;
    ...
    public FilterBase(Func<T, IComparable> sortBy, bool sortAscending, int startRow, int numRow) {
        //assigns to member variables
    }
    public IEnumerable<T> Filter(IEnumerable<T> toFilter) {
        filtered = DoFiltering(toFilter);
        filtered = DoPaging(filtered);
        filtered = DoSorting();
        return filtered;
    }
    protected abstract IEnumerable<T> DoFiltering(IEnumerable<T> toFilter);
    protected virtual IEnumerable<T> DoPaging(IEnumerable<T> toFilter) {
        return toFilter.Skip(startRow).Take(numRow);
    }
    protected virtual IEnumerable<T> DoSorting(IEnumerable<T> toFilter) {
        return sortAscending ? toFilter.OrderBy(sortBy) : toFilter.OrderByDescending(sortBy);
    }
}
public class BookFilter : FilterBase<Book> {
    public BookFilter(string id, string year, string sortBy, string sorDir, int startRow, int numRow) : base(sortBy, sorDir, startRow, numRow) {
        //assign id and year to member variables
    }
    protected override IEnumerable<Book> DoFiltering(IEnumerable<Book> toFilter) {
        return toFilter.Where(b => b.Id == id && b.Year == year);
    }
}

这将允许您为所有类型的过滤器定义一次分页和排序逻辑,并让每个类型根据其私有成员和它们引用的对象类型定义自己的自定义过滤。