Muszę mieć możliwość przeszukiwania kont klientów za pomocą wielu pól wyszukiwania. W tej chwili mam swoją logikę wyszukiwania w moim repozytorium. Logika wyszukiwania obejmuje pewne filtrowanie, które wydaje się bardziej podobne do warstwy domeny, ale oznaczałoby to użycie czegoś takiego jak IQueryable i nie jestem pewien, czy mi się to podoba.Co jest lepsze? Masz skomplikowaną logikę wyszukiwania w repozytorium lub w usłudze na poziomie domeny (przez IQueryable lub inne)?
Na przykład, teraz mam klasy wyszukiwania, który ma wszystkie pola za pomocą którego użytkownik może wyszukać:
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; }
}
Następnie mam usługę poziomie domeny, które po prostu przechodzi klasę szukaj od do magazyn. Nie lubię go:
public class AccountsService : IAccountsService
{
private readonly IAccountRepository _accountRepository;
public AccountsService(IAccountRepository accountRepository)
{
_accountRepository = accountRepository;
}
public IEnumerable<Account> Search(AccountSearch accountSearch)
{
return _accountRepository.Search(accountSearch);
}
}
A potem, mam wszystkie logiki filtrowania w moim repozytorium realizacji:
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
}
Nie jestem pewien, czy powinienem czuć się dobrze o tym czy powinienem znaleźć inny sposób wdrożenia takiego wyszukiwania. Co zrobiłbyś w tej sytuacji?
Mogę zapytać o co chodzi z 'AccountsService' tutaj Wszystko wydaje do zrobienia jest zawijanie 'IAccountRepository' dla pozornie bezcelowego celu: –
Poprawnie Jak zwykle, usunąłem inne metody ze względu na to pytanie, a twoje pytanie jest takie samo jak moje, z wyjątkiem tego, że wolałbym, żeby logika wyszukiwania znajdowała się w nie wiem, jak najlepiej go wdrożyć –