Страницы

Поиск по вопросам

суббота, 6 октября 2018 г.

Как создавать перегруженные методы/функции в сервисе для репозитория

Предположим имеется следующий класс:
public class User { public string FirstName {get;set;} public string LastName {get;set;} public bool Gender {get;set;} public int Age {get;set;} }
public UserService { readonly IRepository _userRepository;
public UserService(IRepository userRepository) { _userRepository = userRepository; }
//Функция возвращающая всех пользователей public IEnumerable GetUsers() { return _userRepository.Table.ToList(); } }
Предположим мне необходимо наложить некие ограничения на возвращаемых пользователей, пусть будет возраст и пол, тогда я создам такую функцию:
public IEnumerable GetUsers(int age, bool gender) { return _userRepository.Table .Where(x=>x.Age==age&&x.Gender==gender) .ToList(); }
А если понадобится фильтровать по какому либо другому набору полей, не создавать же 100500 таких методов/функций, ведь они могут с собой и пересекаться и тогда явно будет дублирование кода.
Данные User, UserService приведены для примера, все совпадения с действительностью не специальны.
Хочется узнать как необходимо создавать перегруженные методы/функции.


Ответ

Это тот момент, когда стоит задуматься, какие у вас абстракции и почему. Как у вас хранятся данные на самом деле?
Положим, на самом деле вы работаете с голым списком прямо в памяти. В этом случае достаточно принимать Func filter и передавать его в Enumerable.Where как есть. Положим, на самом деле вы работаете с базой данных. В этом случае вы можете принимать Expression> filter и передавать его в Queryable.Where как есть. Положим, на самом деле вы работаете с веб-сервисом. В этом случае вы можете принимать список IDictionary с именами свойств и значениями, передавать его сервису, сервис может строить или компилировать соответствующее выражение (в зависимости от того, что в нём на самом деле: вариант 1 или 2).
Если требуются более сложные условия, чем проверка на равенство, нужно смотреть, фильтры какой сложности требуется поддерживать, и искать компромиссы.
Возможно, сейчас я услышу возражения: "Но мне же нужно супер-универсальное сверх-модульное архи-заменяемое решение!" Нет, оно вам не нужно. YAGNI!
Вы никогда не скроете факта, что все три варианта работают с совершенно разной скоростью, имеют разные ограничения и так далее. Нет никакого "общего случая", это миф. Поэтому не изобретайте сложности там, где они вам не нужны. А они вам не нужны практически никогда.
Скажите, зачем вам понадобился "сервис", если уже есть "репозиторий"? Вам действительно нужен лишний слой абстракций?

Комментариев нет:

Отправить комментарий