Добавить зависимость после десериализации объектов - PullRequest
1 голос
/ 26 января 2020

Я разрабатываю программное обеспечение на C#, в котором пользователь может фильтровать объекты данных, применяя последовательный список фильтров. Эти фильтры хранятся в списке классов FilterBase, которые можно сериализовать, а затем загружать и десериализовать. Затем класс Filterer последовательно применяет эти фильтры к набору данных

class FilterBase{
   List<Data> Filter(List<Data> data);
}

class ValueFilter : FilterBase{

   public int MaxValue{get;set;}
   public int MinValue {get;set;}
   List<Data> Filter(List<Data> data){
      //Filter by data.Value
   }
}

class Filterer{
   List<Data> data(List<Filter> filters, List<Data> data){
       //loop over all filters and apply them to data
   }
}

Это работает нормально, но теперь у меня появилось новое требование - фильтр, который требует ввода данных пользователем во время действия фильтрации.

class UserInputFilter: FilterBase{

   IUserInputProvider UserInputProvider{get;set;}   

   List<Data> Filter(List<Data> data){
      var input = UserInputProvider.GetUserInput();
      //Filter by data.SomeValue
   }
}

Теперь этот класс больше не сериализуем, поскольку он требует внедрения зависимости IUserInputProvider.

Мое текущее решение состоит в том, чтобы использовать отражение, чтобы выбрать UserInputFilters из списка десериализованных фильтров, а затем внедрить эту зависимость, однако это кажется не элегантным решением. Есть ли шаблон для решения такой проблемы?

1 Ответ

0 голосов
/ 27 января 2020

Я бы посоветовал передать свой провайдер в качестве параметра методу Filter:

class UserInputFilter: FilterBase
{
    List<Data> Filter(List<Data> data, IUserInputProvider provider)
    {
        var input = provider.GetUserInput();
        //Filter by data.SomeValue
    }
}
...