Мне нужно иметь возможность искать учетные записи клиентов по нескольким полям поиска. Прямо сейчас, у меня есть логика поиска в моем репозитории. Логика поиска включает в себя некоторую фильтрацию, которая больше похожа на принадлежащий ей уровень домена, но это будет означать использование чего-то вроде IQueryable, и я тоже не уверен, что мне это тоже нравится.
Например, прямо сейчас у меня есть класс поиска, который имеет все поля, по которым пользователь может искать:
public class AccountSearch
{
public decimal Amount { get; set; }
public string CustomerId { get; set; }
public string Address { get; set; }
public string CustomerName { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string State { get; set; }
}
Затем у меня есть служба уровня домена, которая просто передает класс поиска в репозиторий. Мне это не нравится:
public class AccountsService : IAccountsService
{
private readonly IAccountRepository _accountRepository;
public AccountsService(IAccountRepository accountRepository)
{
_accountRepository = accountRepository;
}
public IEnumerable<Account> Search(AccountSearch accountSearch)
{
return _accountRepository.Search(accountSearch);
}
}
И тогда у меня есть вся логика фильтрации в моей реализации репозитория:
public class AccountRepository : IAccountRepository
{
private AccountDataContext _dataContext;
public AccountRepository(AccountDataContext entityFrameworkDataContext)
{
_dataContext = entityFrameworkDataContext;
}
public IEnumerable<Account> Search(AccountSearch accountSearch)
{
// My datacontext contains database entities, not domain entities.
// This method must query the data context, then map the database
// entities to domain entities.
return _dataContext.Accounts
.Where(TheyMeetSearchCriteria)
.Select(MappedAccounts);
}
// implement expressions here:
// 1. TheyMeetSearchCriteria filters the accounts by the given criteria
// 2. MappedAccounts maps from database to domain entities
}
Не уверен, если я буду чувствовать себя хорошо об этом или если я найду другой способ реализовать такой поиск. Что бы вы сделали в этой ситуации?