Хороший вопрос, чтобы спросить.
Половина идеи использования DI состоит в том, чтобы убрать беспокойство / тонкую настройку поведения экземпляра из внедряемого кода. Поэтому, возможно, имеет смысл изменить класс Category
, чтобы он больше не был static
, объявить его зависимости в ctor и позволить клиентскому коду соединить его вместе.
Относительно того, как получить к нему доступ, если вы действительно уверены, что это хорошая идея ... Как правило, в вашем случае было бы создать CacheServiceResolver
и зарегистрировать его [в вашем веб-проекте]. Затем передайте ему экземпляр Kernel
в процессе его создания. Таким образом, ваша DLL связана только с интерфейсом вашего CacheServiceResolver
.
Другой часто используемый подход состоит в том, чтобы использовать средство «Service Locator» в крайнем случае где-то в глобальном масштабе, которое предоставляет «GlobalGet». Но это, как правило, плохая идея, и ее следует использовать только для целей временного склеивания воздуховодов.
Еще одна вещь, на которую стоит обратить внимание, - это Common Service Locator, который позволит сделать библиотеку нейтральной к контейнеру, хотя за пределами EL вы не найдете много использования, так как вы не должны действительно показывать свой контейнер .
Другой вариант - запросить Func<T>
фабричный метод и Bind
к лямбде, который разрешает его, извлекая этот поиск из вашего кода.
РЕДАКТИРОВАТЬ: В Ninject 2 нет необходимости явно передавать Kernel
экземпляров, как я уже сказал - можно просто запросить IKernel
в вашем ctor, и вы получите его, независимо от разрешения запрос явно передает один дюйм.
РЕДАКТИРОВАТЬ 2: Действительно, недоволен моим ответом, пытался сделать его более общим, не забивая его слишком много. Суть в том, что желаемые варианты обычно в следующем порядке:
- без контейнерных артефактов, оставьте шить для клиента
- предоставляет контейнерно-нейтральную точку расширения, специально предназначенную для конкретного выполнения чего-либо в контексте вашей библиотеки, используя терминологию на вездесущем языке домена вашей библиотеки вместо нейтрализованных абстрактных терминов контейнера
- обеспечивает контейнерно-нейтральный подход к интеграции в виде Common Service Locator
- только тогда подумайте о людях, нуждающихся в
- знаю свой контейнер
- понимаю ваш контейнер