#aspnet_mvc #архитектура
Добрый день. Я начинающий программист, поэтому могут возникать глупые вопросы. Делаю проект на ASP.MVC, возник вопрос связанный с архитектурой проекта. У меня есть класс ViewModel, в котором содержатся данные, с которыми будет работать контроллер и которые будут выводиться на интернет-страницей. Есть класс ViewModelBuilder, который преобразует объект базы данных во ViewModel и наоборот. Мне нужно принять строку, введенную пользователем, обработать ее, вытянуть недостающие данные из интернета и сформировать ViewModel. Возник вопрос, в какой класс написать методы, обрабатывающие входные данные (это не валидация), вытягивающие их сети недостающие данные и формирующие ViewModel. Варианта у меня 3: - В контроллер - В ViewModel - В отдельный класс расширения к ViewModel. Идея с контроллером мне не нравится, так как эти методы все-таки BusinessLayer и в контроллере им делать особо нечего. ViewModel почему-то тоже не хочется грузить этими методами. Вроде бы как они будут логично смотреться в этом классе, но почему-то на уровне интуиции, мне эта идея не нравится. Вынести их в класс расширения я боюсь за производительность. Вопрос: где правильно с точки зрения архитектуры и следования принципам MVC разместить методы, которые обрабатывают строку, введенную пользователем, преобразуют ее, вытягивают из сети данные и преобразуют их для записи в свойства ViewModel.
Ответы
Ответ 1
Вижу в вашем вопросе два слоя. Первый -- про производительность методов расширения. По факту, это всего лишь синтаксический сахар для вызова статического метода. Когда компилятор встречает инструкцию вызыва экстеншена -- он генерирует IL-код вызывающий статический класс: void Main() { var message = "Hello Extension Methods"; int counter1 = message.WordCount(); int counter2 = MyExtensions.WordCount(message); } // Define other methods and classes here public static class MyExtensions { public static int WordCount(this String str) { return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length; } } IL-код одинаковый в обоих случаях: Вы переживаете о возможном падении производительности. Но у вас в приложении есть чтение из БД и парсинг интернета -- намного более долгие операции, в десятки и сотни раз. Вы боитесь потерять, но там экономия на спичках. Второй слой вопроса -- где размещать правильно. Я бы хотел ответить вам в терминах DDD (Domain-driven design): там где у вас находится слой, который называется предметная область. Вот у вас собственно описание этого класса: Мне нужно принять строку, введенную пользователем, обработать ее (и это не валидация), вытянуть недостающие данные из интернета и сформировать ViewModel. Я не знаю вашу предметную область, поэтому могу предложить назвать этот класс *Manager. Это не очень правильно с точки DDD и подход можно критиковать, но архитектурно -- движение в более правильную сторону, всяко лучше чем размещать метод на контроллере (архитектура ТТУК (Толстый тупой уродливый контроллер)) и тем более выносить [бизнес-логику] в слой представления.
Комментариев нет:
Отправить комментарий