Поставщик Ninject не может разрешить типы, зарегистрированные в именованной области
Я использую расширение NamedScoped Ninject в попытке создать графы объектов, которые создаются каждый раз, когда обработчик команд создается контейнером. Другими словами, мне нужен свежий граф объектов для каждой команды, которая может быть обработана соответствующим обработчиком.
Я использовал привязку.DefinesNamedScope("TopLevelOrhcestrator") при регистрации моих "обработчиков команд", так как они являются верхним уровнем для обработки команд.
Тип в этой именованной области должен быть введен с результатом вызова метода для типа, уже зарегистрированного в этой именованной области. Я думал, что лучший способ сделать это будет с непрямым поставщиком. Внутри провайдера я пытаюсь разрешить тип в надежде, что смогу вызвать метод для его передачи в другой объект, который я создаю в этой именованной области. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я спрашиваю IContext для экземпляра внутри поставщика клиента, я получаю исключение, которое говорит: "Нет подходящих областей действия, и тип объявляется InNamedScope(TopLevelOrchestrator).
context.Kernel.Get<TypeAlreadyRegisteredInScope>().MethodThatGetsAnotherDependency()
Можно ли получить типы из контейнера внутри провайдера Ninject, когда они зарегистрированы в именованной области?
РЕДАКТИРОВАТЬ
Я извиняюсь, если сценарий использования выглядит немного странным, я экспериментирую с некоторыми идеями о том, как управлять своими единицами работы и другими службами / менеджерами, которым может потребоваться ручка для выполнения бизнес-сценария. Я знаю, что единица работы обычно "запускается", а затем переходит во все зависимости, которые могут потребоваться для участия в более широком процессе. Я подумал, что лучше позволить моему оркестровщику взять фабрику за единицу работы, чтобы она могла детерминистически уничтожить UOW, и было бы ясно, кто является владельцем сценария использования. То, что будет предоставлено менеджерам / службам, будет прокси для единицы работы, которая будет нулевой до тех пор, пока оркестратор не запустит реальную единицу работы. Вот почему я пытался связать прокси из уже зарегистрированного типа в моем провайдере. На данный момент все это очень экспериментально и проверяет некоторые идеи.
Я был бы рад услышать любые дальнейшие мысли.
1 ответ
За MethodThatGetsAnotherDependency()
быть способным .Get<>()
экземпляр, который связан .InNamedScope(...)
вам нужно будет добавить расширение сохранения контекста.
Это связано с тем, что NamedScope добавляет параметр в контекст запроса привязки, которая имеет .DefinesNamedScope(...)
, Как только этот запрос закончится, этот контекст и его параметры будут забыты. Теперь с расширением Context Preservation контекст сохраняется и используется повторно для поздних / заводских созданий (Func<>
, интерфейс фабрики с .ToFactory()
связывание...). Это думает, что это должно также работать с поставщиками. Если нет, просто переключитесь на фабрику вместо провайдера.
Однако я должен признать, что я не до конца понимаю, почему / чего вы пытаетесь достичь. Там могут быть более простые способы.