В моем кешировании опыта делается ата определенного слоя - и то, что вы кэширование применяется в пределах этого слоя, так:
- Вы можете кэшировать данные в DAL так, что ДАЛ возвращает его из памяти, а не ударом БД снова; поэтому здесь мы кэшируем «сырые» данные на уровне данных.
- BL может кэшировать аналогичные данные (скажем, POCO) - другими словами, «логические» данные, на которые был применен BL; поэтому здесь мы кэшируем данные BL на уровне BL.
- Ваш UI может кэшировать (вы догадались) информацию, которая построена на уровне пользовательского интерфейса - Лик представление данных в виде веб-страницы, XML и т.д.
Когда вы смотрите на кэширование, как архитектор/разработчик системы, вы будете принимать решения о том, что стоит делать в кешировании, обычно это зависит от потребности в балансе:
- Производительность должна достигать определенной цели.
- Какие временные (и стоимость) варианты у вас есть.
Предполагая, что мы кэширования для повышения производительности, вы хотите, чтобы проанализировать вашу систему и выявить узкие места, которые должны быть удалены или избежать - первый проход этого анализа следует, по крайней мере определить, какой слой, чтобы сосредоточиться на первый.
Еще одна вещь, которую следует учитывать, заключается в том, что чем больше вы можете кэшировать ближе к потребителю, тем меньше должна выполняться обработка в целом; другими словами, если вы можете кэшировать на уровне пользовательского интерфейса, тогда уровни BL и DAL даже не получат внешний вид (вам не нужно добавлять туда кеширование).
На этом этапе я хочу спросить вас, что именно вы пытаетесь достичь.
Хотя все, что я сказал, верно (насколько мне известно), все это основано на предположении, что мы поставляем «вертикальные» фрагменты системных функций (например, «создание счета-фактуры», «добавление продукт "и т. д.); есть еще одна модель, которую вы можете применить - сквозная модель проблем.
Подумайте о чем-то вроде ведения журнала - каждая часть вашей системы (UI/BL/DAL) должна иметь возможность регистрировать системные события; моим любимым инструментом для этого являются MS Enterprise Libraries (MSEntLibs). Когда я работаю с ними, я считаю их «черным ящиком» - самостоятельной единицей. Я (по выбору) понятия не имею, как они защищены - важная вещь состоит в том, что они изолированы и имеют зависимости, которые легко регулировать.
MSEntLibs может регистрироваться в базе данных, но если я вызову метод ведения журнала MSEntLibs (для входа в БД) прямо из моего интерфейса (и пропуская мой BL), мне все равно.
Поэтому в зависимости от того, что вы пытаетесь сделать правильный anmswer будет либо:
- Просто определить, что нужно кэшировать на давая соответствующий слой с этим справиться.
- Вам не нужно пытаться использовать DI для передачи материала вам BL вообще - может быть уместен сквозной компонент черного ящика?