2010-09-02 2 views
0

Большинство рекомендаций по архитектуре приложений, по-видимому, настоятельно советуют, чтобы только уровень представления должен иметь доступ к HTTPContext (для содействия ослаблению связи, уменьшению зависимостей, повышению тестовой способности и т. Д.).Архитектура WebApplication - советы по сохранению HTTPContext на уровне презентации

Итак, как люди относятся к кешированию и сеансу? Для определения того, какие элементы необходимо кэшировать, для обеспечения максимальной эффективности приложений требуется очень специфическое знание DataAccess и Business Logic. Однако и веб-приложение ASP.Net доступ к ним предоставляется через HTTPContext.

Одним из вариантов было бы создание CacheFactory и SessionFactory, а также интерфейса ICache и ISession, а затем каким-то образом использовать принцип DI для передачи и ISession и ICache для каждого метода в BLL и последующем DA Layer, который ему нужен.

Действительно ли это, что разработчики в конечном итоге делают? Есть ли другой, более простой способ справиться с этим?

Спасибо за любой совет.

ответ

1

Лично, если я разрабатываю только для ASP.NET (сети), и я знаю, что библиотеки классов предназначены только для таргетинга в Интернете, у меня нет проблем с ссылкой на System.Web или любую другую сборку по мере необходимости. Иногда практичность должна быть первой.

С другой стороны, если вы знаете или не уверены, что BLL, DAL или другие слои могут повторно использоваться на клиент-сервере или в другой среде, вам может потребоваться использовать более гибкий подход, например сеанс интерфейс обработчика и т. д.

Главное, что вы четко понимаете, что рекомендует наилучшая практика. В этот момент вы можете принимать рациональные решения о том, что должно применяться к каждому проекту или ситуации. Он не всегда будет похож на перчатку.

0

В моем кешировании опыта делается ата определенного слоя - и то, что вы кэширование применяется в пределах этого слоя, так:

  • Вы можете кэшировать данные в DAL так, что ДАЛ возвращает его из памяти, а не ударом БД снова; поэтому здесь мы кэшируем «сырые» данные на уровне данных.
  • BL может кэшировать аналогичные данные (скажем, POCO) - другими словами, «логические» данные, на которые был применен BL; поэтому здесь мы кэшируем данные BL на уровне BL.
  • Ваш UI может кэшировать (вы догадались) информацию, которая построена на уровне пользовательского интерфейса - Лик представление данных в виде веб-страницы, XML и т.д.

Когда вы смотрите на кэширование, как архитектор/разработчик системы, вы будете принимать решения о том, что стоит делать в кешировании, обычно это зависит от потребности в балансе:

  • Производительность должна достигать определенной цели.
  • Какие временные (и стоимость) варианты у вас есть.

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

Еще одна вещь, которую следует учитывать, заключается в том, что чем больше вы можете кэшировать ближе к потребителю, тем меньше должна выполняться обработка в целом; другими словами, если вы можете кэшировать на уровне пользовательского интерфейса, тогда уровни BL и DAL даже не получат внешний вид (вам не нужно добавлять туда кеширование).

На этом этапе я хочу спросить вас, что именно вы пытаетесь достичь.

Хотя все, что я сказал, верно (насколько мне известно), все это основано на предположении, что мы поставляем «вертикальные» фрагменты системных функций (например, «создание счета-фактуры», «добавление продукт "и т. д.); есть еще одна модель, которую вы можете применить - сквозная модель проблем.

Подумайте о чем-то вроде ведения журнала - каждая часть вашей системы (UI/BL/DAL) должна иметь возможность регистрировать системные события; моим любимым инструментом для этого являются MS Enterprise Libraries (MSEntLibs). Когда я работаю с ними, я считаю их «черным ящиком» - самостоятельной единицей. Я (по выбору) понятия не имею, как они защищены - важная вещь состоит в том, что они изолированы и имеют зависимости, которые легко регулировать.

MSEntLibs может регистрироваться в базе данных, но если я вызову метод ведения журнала MSEntLibs (для входа в БД) прямо из моего интерфейса (и пропуская мой BL), мне все равно.

Поэтому в зависимости от того, что вы пытаетесь сделать правильный anmswer будет либо:

  • Просто определить, что нужно кэшировать на давая соответствующий слой с этим справиться.
  • Вам не нужно пытаться использовать DI для передачи материала вам BL вообще - может быть уместен сквозной компонент черного ящика?
Смежные вопросы