Размывает ли возможность запросов и отложенная загрузка в C # границы между доступом к данным и бизнес-логикой?

Я переживаю философский архитектурный кризис в середине своей карьеры. Я вижу очень четкие границы между тем, что считается клиентским кодом (пользовательский интерфейс, веб-службы, MVC, MVP и т. Д.) И уровнем обслуживания. Однако линии от уровня обслуживания становятся более размытыми с каждой минутой. И все началось с возможности запрашивать код с помощью Linq и концепции отложенной загрузки.

Я создал бизнес-уровень, который состоит из контрактов и реализаций. Тогда Реализации могут иметь зависимости от других Контрактов и так далее. Это обрабатывается через контейнер IoC с DI. Есть одна служба, которая обрабатывает DataAccess, и все, что она делает, это возвращает UnitOfWork. Этот UnitOfWork создает транзакцию при расширении и фиксирует данные в методе Commit. [ Просмотреть эту статью (Testability and Entity Framework 4.0) ]:

public interface IUnitOfWork : IDisposable {
   IRepository GetRepository() where T : class;
   void Commit();
}

Репозиторий является универсальным и работает с двумя реализациями (EF4 и InMemory DataStore). T состоит из POCO, которые генерируются из схемы базы данных или сопоставлений EF4. Возможность тестирования встроена в дизайн репозитория. Мы можем использовать реализацию в памяти для подтверждения результатов с ожиданиями.

public interface IRepository where T : class {
   IQueryable Table { get; }
   void Add(T entity);
   void Remove(T entity);
}

Хотя источник данных является абстрактным, IQueryable по-прежнему дает мне возможность создавать запросы в любом месте бизнес-логики. Вот пример.

public interface IFoo {
   Bar[] GetAll();
}

public class FooImpl : IFoo {
   IDataAccess _dataAccess;
   public FooImpl(IDataAccess dataAccess) {
      _dataAccess = dataAccess;
   }

   public Bar[] GetAll() {
      Bar[] output;
      using (var work = _dataAccess.DoWork()) {
          output = work.GetRepository().Table.ToArray();
      }
      return output;
   }
}

Теперь вы можете увидеть, как запросы могут стать еще более сложными, если вы выполняете объединения со сложными фильтрами.

Поэтому мои вопросы:

  1. Имеет ли значение, что нет четкого различия между BLL и DAL? .
  2. Считается ли запрашиваемость доступом к данным или бизнес-логикой, когда за уровнем репозитория, который действует как абстракция InMemory?

Дополнение: чем больше я думаю об этом, возможно, второй вопрос был единственным, который следовало задать.

6
задан Steven Pardo 30 September 2010 в 18:16
поделиться