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"];
}

Мы немного упростили это с помощью базового класса кеша, но это общая идея.

Если я правильно читаю ваш вопрос, вы используете почти активный шаблон записи в ваших моделях представлений, чтобы скрыть взаимодействия доступа к домену / данным, чтобы вы могли поддерживать свои контроллеры на плаву, и теперь вся сложность, которую вы добавили, причиняет вам боль?

Модели представлений должны быть почти тупыми контейнерами данных, ориентированными на логику представления, а не на получение данных из базы данных и т. Д. Все, что вы сделали, - это сместили логику с контроллера (где он должен быть) на модель.

Могу ли я предложить вам удалить код доступа к данным из модели, использовать действия вашего контроллера для извлечения соответствующих данных и что-то вроде объектного сопоставителя для сопоставления данных с вашими моделями представления.

Кэширование должно применяться на уровне доступа к данным - вы пытаетесь повысить производительность за счет сокращения числа обращений к базе данных - и это кэширование должно быть прозрачным для пользователей уровня доступа к данным.

Кроме того, вы действительно уверены, что у вас есть проблемы с производительностью? Проводили ли вы нагрузочные тесты, чтобы определить текущий профиль производительности и точки доступа, требующие исправлений производительности?

Другие вопросы по тегам