У нас есть настройка уровня доступа к данным для использования репозиториев, сервисов и спецификаций (для предварительно определенных запросов). Сервисный уровень при сохранении данных принимает 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" И Address.City = "Миртл-Бич"
Итак, у нас может быть выражение, которое мы отправляем в Службу:
u => u.Username.StartsWith("A") && u.Address.City == "Myrtle Beach"
Я пытаюсь выяснить, как лучше всего преобразовать некоторые из этих мыслей в служении. Кто-нибудь еще делал что-нибудь подобное?
Я думал о том, что приложение отфильтровывает результаты из службы, но меня беспокоит, что набор результатов может быть огромным. Я только хотел вернуть то, что было нужно из базы данных через репозитории.