Поставщик Ninject не может разрешать типы, зарегистрированные в именованной области

Я использую расширение NamedScoped Ninject в попытке создать графы объектов, которые создаются каждый раз, когда контейнер создает обработчик команд. Другими словами, мне нужен новый граф объектов для каждой команды, которая может быть обработана соответствующим обработчиком.

Я использовал привязку .DefinesNamedScope("TopLevelOrhcestrator") при регистрации моих "обработчиков команд", поскольку они являются верхним уровнем для обработки команд.

Тип в этой именованной области необходимо внедрить с результатом вызова метода для типа, уже зарегистрированного в этой именованной области. Я подумал, что лучший способ сделать это — использовать нинект-провайдера. Внутри провайдера я пытаюсь разрешить тип в надежде, что смогу вызвать для него метод для передачи в другой объект, который я создаю в этой именованной области. Проблема, с которой я сталкиваюсь, заключается в том, что когда я запрашиваю IContext для экземпляра внутри поставщика клиентов, я получаю исключение, в котором говорится: «Нет подходящих областей действия, и тип объявлен InNamedScope (TopLevelOrchestrator).

context.Kernel.Get<TypeAlreadyRegisteredInScope>().MethodThatGetsAnotherDependency()

Можно ли получить типы из контейнера внутри провайдера Ninject, когда они зарегистрированы внутри именованной области?

ИЗМЕНИТЬ

Прошу прощения, если вариант использования кажется немного странным, я экспериментирую с некоторыми идеями о том, как управлять своими единицами работы и другими службами/менеджерами, которым может понадобиться дескриптор uow для завершения бизнес-варианта использования. Я знаю, что обычно единица работы «запускается», а затем передается во все зависимости, которые могут потребоваться для участия в более крупном процессе. Я подумал, что скорее позволю своему оркестратору взять фабрику единиц работы, чтобы он мог детерминистически уничтожить UOW, и было бы ясно, кто является владельцем варианта использования. То, что будет предоставлено менеджерам/службам, будет прокси для единицы работы, которая будет нулевой, пока оркестратор не запустит реальную единицу работы. Поэтому я и пытался привязать прокси от уже зарегистрированного типа у своего провайдера. На данный момент все это очень экспериментально и проверяло некоторые идеи.

Буду рад услышать любые дальнейшие мысли.


person Jeremy F    schedule 10.09.2014    source источник


Ответы (1)


Чтобы MethodThatGetsAnotherDependency() иметь возможность .Get<>() экземпляра, привязанного .InNamedScope(...), вам необходимо добавить Сохранение контекста Расширение.

Это связано с тем, что NamedScope добавляет параметр в контекст запроса привязки, который имеет .DefinesNamedScope(...). Как только этот запрос завершится, этот контекст и его параметры будут забыты. Теперь с расширением ContextPreservation контекст сохраняется и повторно используется для поздних/фабричных созданий (Func<>, фабрика интерфейсов с привязкой .ToFactory()...). Он думает, что он также должен работать с провайдерами. Если нет, просто переключитесь на фабрику вместо провайдера.

Однако я должен признать, что я не совсем понимаю, почему/чего вы пытаетесь достичь. Может есть более простые способы.

person BatteryBackupUnit    schedule 10.09.2014
comment
Я добавил расширение сохранения контекста и должен был использовать GetContextPreservingResolutionRoot() в контексте, чтобы контекст мог разрешить именованный тип области: return context.GetContextPreservingResolutionRoot().Get‹TypeAlreadyRegisteredInScope›().MethodThatGetsAnotherDependency(); - person Jeremy F; 10.09.2014