При планировании архитектуры для средне-масштабного веб-приложения MVC, как вы реализуете слои, чтобы они были максимально разделены и легко тестировались? (в основном следуйте рекомендациям) Допустим, я сначала использую код для доступа к данным.
Я борюсь с тем, как определить «бизнес-логику», и как она предназначена для взаимодействия с уровнем данных. Если взять в качестве примера приложение для продажи транспортных средств, будут ли бизнес-логики классами, выполняющими такие задачи, как расчет налоговой полосы для данных транспортных средств, сравнение статистики в милю на галлон и т. Д. Что касается бизнес-объектов (например, автомобили, фургоны, мотоциклы), я бы поместил их в слой данных вместе со своим DataContext
классом.
Кроме того, что составило бы логику приложения в отличие от бизнеса - я предполагаю такие вещи, как проверка сеансов / пользовательского ввода?
Так, например, контроллер автомобиля может возвращать результат действия / просмотра, в котором перечислены десять лучших автомобилей, отфильтрованных по типу и наилучшей mpg. ICarRepository
Допустим, у меня есть «carRepo», вставленный в мой контроллер (с использованием шаблона репозитория / DI), я отфильтрую свои автомобили по параметру метода действия, напримерvar cars = carRepo.getCarsByType("hatchback");
Итак, я сохранил знания о доступе к данным из моего контроллера с помощью репозитория, чтобы теперь не пускать бизнес-логику в контроллер с использованием модели домена - var result = new MpgCalculator (cars); - Допустим, мне нужен класс калькулятора, потому что он должен выполнять дополнительную логику для расчета максимальной эффективности использования топлива, а не просто загружать / фильтровать объекты из БД. Итак, теперь у меня есть набор данных для моего представления для рендеринга, который использовал репозиторий для извлечения из уровня доступа к данным, и специфичный для домена объект для обработки и выполнения бизнес-задач с этими данными.
Я делаю ошибки здесь? нам все еще нужно использовать шаблон репозитория или я могу просто написать код для интерфейса, чтобы отделить ORM и протестировать? По этой теме, поскольку мои конкретные dbcontext для доступа к данным находятся на уровне данных, должны ли определения интерфейсов переходить на уровень домена / бизнеса, что означает, что если технология доступа к данным когда-либо будет изменена, другие мои уровни не будут затронуты?
Из того, что я изучил до сих пор, моя структура выглядит так:
Интернет-приложение MVC -> Стандартный интернет-проект - здесь представлены модели ViewModels
Уровень домена / бизнеса -> бизнес-классы / модели, которые контроллеры могут использовать для обработки сущностей домена из уровня данных, прежде чем переходить к соответствующим представлениям
Репозиторий абстракция нужна? -> Я слышу много споров по этому поводу, особенно при использовании ORM
Уровень данных -> классы объектов (автомобиль, фургон, мотоцикл), DbContext - уровень технологии доступа к конкретным данным