Нет, это не странно, и на самом деле это очень похоже на то, как я это делаю.
Только различия для меня:
- Я использую
IQueryable<T>
вместо IEnumerable<T>
(для получения отсроченного исполнения)
- У меня есть общий репозиторий (
Repository<T>
):
IQueryable<T> Find()
void Add(T)
- и т. Д.
Таким образом, мои хранилища остаются чистыми / простыми.
Таким образом, ваш BLL может быть реализован так:
public IEnumerable<Order> GetOrders(long CustomerID)
{
Repository<Order> orderRepository = new Repository<Order>(); // should use DI here, but i digress
return orderRepository
.Find() // no query executed...
.Where(o => o.CustomerID == CustomerID) // still nothing...
.ToList(); // query executed, with BL applied! cool!
}
Заставляет BLL выполнять проекцию / работу / логику. Хранилища просто обрабатывают постоянство T, не заботятся о реальном типе или какой-либо бизнес-логике.
Вот так все и делаю.