Я переживаю философский архитектурный кризис в середине своей карьеры. Я вижу очень четкие границы между тем, что считается клиентским кодом (пользовательский интерфейс, веб-службы, 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;
}
}
Теперь вы можете увидеть, как запросы могут стать еще более сложными, если вы выполняете объединения со сложными фильтрами.
Поэтому мои вопросы:
Дополнение: чем больше я думаю об этом, возможно, второй вопрос был единственным, который следовало задать.