asp mvc: вызовы базы данных и кэширование, ввод 4-й сущности?
Вот архитектура моего приложения:
У меня есть слой доступа к данным в отдельной сборке, с классом, содержащим такие методы, как List_XYZ, Insert_XYZ, Update_XYZ и т. Д. Все методы возвращают или используют объекты из созданной мной объектной модели, которая также находится в сборке слоя доступа к данным.
В моем приложении MVC я создал виды, контроллеры и модели. Внутри моделей я придерживался логики вызова уровня доступа к данным и заполнения себя из классов объектной модели уровня доступа к данным, а также логики для создания классов уровня доступа к данным и передачи их на уровень доступа к данным для вставки обновлений:
|-----MVC Application---------||-----------Data Access Layer------|
View -> Controller -> Model <--> Object <--> Data Access Layer <--> Database
Теперь, поскольку некоторые представления становятся немного более сложными, мне нужно получить список поисков для раскрывающихся списков, а также получить подробную информацию об объекте, который я редактирую или просматриваю, и я добавляю логику для кэширования. мне интересно, если модель действительно место для этих данных. Я думал о переносе связи между моделью MVC и уровнем доступа к данным на контроллер, но мне нравится иметь хороший наклонный контроллер и модель, поэтому я думаю о 4-м объекте. Я знаю, что было много дискуссий о том, куда поместить бизнес-правила / вызовы базы данных, если это должно быть в контроллере или модели, но не было много дискуссий о введении 4-го объекта. Плохая идея?
2 ответа
4-й объект означает 4-й слой? Для таблиц поиска у нас есть класс, который содержит все запросы. Тогда довольно просто использовать ASP.NET Caching для кэширования каждого вызова. Например, этот класс поиска может содержать вызовы, такие как Fetch_States(), Fetch_Statuses(), Fetch_Colors и т. Д. Например:
IEnumerable<RefTable_State> Fetch_States()
{
if HttpContext.Current.Cache["States"] == null
{
HttpContext.Current.Cache.Insert("States", DAL.Get_States());
}
return (IEnumerable<RefTable_State>)HttpContext.Current.Cache["States"];
}
Мы немного упростили это с помощью базового класса кеша, но это общая идея.
Если я правильно читаю ваш вопрос, вы используете почти активный шаблон записи в ваших моделях представлений, чтобы скрыть взаимодействия доступа к домену / данным, чтобы вы могли поддерживать свои контроллеры на плаву, и теперь вся сложность, которую вы добавили, причиняет вам боль?
Модели представлений должны быть почти тупыми контейнерами данных, ориентированными на логику представления, а не на получение данных из базы данных и т. Д. Все, что вы сделали, - это сместили логику с контроллера (где он должен быть) на модель.
Могу ли я предложить вам удалить код доступа к данным из модели, использовать действия вашего контроллера для извлечения соответствующих данных и что-то вроде объектного сопоставителя для сопоставления данных с вашими моделями представления.
Кэширование должно применяться на уровне доступа к данным - вы пытаетесь повысить производительность за счет сокращения числа обращений к базе данных - и это кэширование должно быть прозрачным для пользователей уровня доступа к данным.
Кроме того, вы действительно уверены, что у вас есть проблемы с производительностью? Проводили ли вы нагрузочные тесты, чтобы определить текущий профиль производительности и точки доступа, требующие исправлений производительности?