В Ninject это где я бы использовал дочернюю область? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть проект WebAPI, использующий Ninject 3. Примерно в 99% случаев мои инъекции находятся в области запросов с использованием расширений Ninject.Web.WebApi.

Однако у меня есть случай, когда япотребуется получить версию типа Transient-scoped, которая обычно вводится с областью запроса.В идеале все его инъекции также должны были стать временными (или, по крайней мере, изолированными).

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

Итак, мой класс, давайте просто назовем его Frog, зарегистрирован как .InRequestScope (), потому что большую часть времени я так хочу своих лягушек.

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

Итак, я думал о Factory Pattern, где у меня будет FrogFactory, и когда я вызываю FrogFactory.Create, он использует Ninject для разрешения Frog, но это новый, уникальный экземпляр Frog каждый раз, когда вы вызываетеFrogFactory.Create ();

(обратите внимание, что лягушка все еще должна иметь привязку .InRequestScope() также для всех тех мест, где я делю своих лягушек).

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

Как бы я это настроил?(или есть какая-то магия условного связывания Ninject, которая помогает мне разобраться с заводским паттерном?)

1 Ответ

0 голосов
/ 10 июля 2018

вы, вероятно, ищете .WhenXxx() методы условного связывания.вам понадобятся некоторые критерии, чтобы отличить потребителей Transient scoped Frog от остальных, которые вы используете в вашей условной привязке, такие как имя класса, атрибут, примененный к классу, атрибут, примененный к параметру конструктора и т. д.

тогда ваши привязки будут выглядеть примерно так:

Bind<IFrog>().To<MyTransientFrog>()
    .WhenClassHas<TransientAttribute>()
    .InTransientScope();

Bind<IFrog>().To<MyRequestFrog>()
    .InRequestScope();

Если ни один из предоставленных методов не подходит для вашего варианта использования, вы можете вызвать универсальный .When() и предоставить предикат для определения условия.

Обратите внимание, что вам также потребуется указать условные привязки для любой зависимости, которая вставляется в MyTransientFrog, чтобы они также были переходными, если они еще не были.

Bind<IFrogDependency>().To<MyTransientFrogDependency>()
    .WhenInjectedInto<MyTransientFrog>()
    .InTransientScope();

(временная область является стандартной и подразумевается в простых привязках, но показана здесь для ясности)

...