Плануючи архітектуру середньомасштабного веб-додатка MVC, як ви реалізуєте шари, щоб вони були максимально відокремленими та легкими для тестування? (в основному слідкуйте за найкращими методами) Скажімо, я спочатку використовую код у якості доступу до даних.
Я бореться з тим, як визначити "бізнес-логіку" як і як мається на увазі взаємодія з рівнем даних. Взявши за приклад заявку на продаж транспортних засобів, чи буде бізнес-логікою класи, які виконували завдання, такі як обчислення податкового діапазону для даного транспортного засобу, порівнюючи милю за галон літ статистики тощо? Що стосується суб’єктів підприємницької діяльності (наприклад, Автомобілі, Фургони, Мотоцикли), я б поставив їх у рівень даних разом зі своїм DataContext
класом.
Крім того, що складатиме логіку програми на відміну від бізнесу - я здогадуюсь такі речі, як перевірка сеансу / введення користувача?
Так, наприклад, контролер автомобіля може повернути результат дії / перегляду, в якому перераховано десятку найкращих автомобілів, відфільтрованих за типом та найкращими mpg. Так, скажімо, у мене введено ICarRepository
"carRepo", що вводиться в контролер (використовуючи шаблон сховища / DI), я фільтрую свої машини за параметром методу дії, наприкладvar cars = carRepo.getCarsByType("hatchback");
Тому я зберігав знання про доступ до даних поза моїм контролером за допомогою сховища, тепер для того, щоб ділова логіка вийшла з контролера за допомогою доменної моделі - var result = new MpgCalculator (машини); - Скажімо, мені потрібен клас калькулятора, оскільки він повинен виконувати додаткову логіку для обчислення найкращої економії палива, більше ніж просто завантаження / фільтрування об'єктів з БД. Отже, тепер у мене є набір даних для відображення, який використовував репозиторій для отримання з рівня доступу до даних, і об'єкт, що стосується домену, для обробки та виконання завдань, пов'язаних з бізнесом, на цих даних.
Чи я тут помиляюся? чи все-таки нам потрібно використовувати шаблон сховища чи я можу просто кодувати проти інтерфейсу, щоб роз'єднати ORM і протестувати? У цій темі, оскільки мої конкретні класи (класи) доступу до даних dbcontext знаходяться в рівні даних, чи повинні визначення інтерфейсу переходити в рівень домен / бізнес, тобто, якщо технологія доступу до даних коли-небудь буде змінена, інші мої шари не будуть виконані?
З того, що я вивчив поки що, моя структура виглядає так:
Інтернет-додаток MVC -> Стандартний інтернет-проект - моделями тут є ViewModels
Доменний / бізнес-рівень -> бізнес-класи, класи / моделі, які контролери можуть використовувати для обробки об'єктів домену із рівня даних, перш ніж переходити до відповідних представлень даних
Необхідна абстракція сховища? -> Я чую багато дискусій з цього приводу, особливо під час використання ORM
Рівень даних -> Класи особи (Автомобіль, Ван, Мотоцикл), DbContext - Бетонний рівень доступу до даних