Ninject каскадное именованное разрешение? - PullRequest
0 голосов
/ 07 января 2019

У меня есть два объекта, которые поддерживают один и тот же интерфейс. Каждый объект имеет свой собственный объект конфигурации, который передается в качестве аргумента конструктора. Я хочу, чтобы Ninject использовал имя объекта для разрешения того же параметра конфигурации. В настоящее время, если я делаю kernel.Get ("one"), он не может разрешить ThingConfig, даже если для этого имени точно зарегистрирован один. (РЕДАКТИРОВАТЬ: Исправлен пример для включения привязки ThingConfig):

class MyService
{
    public MyService([Named("one")] IThing one, [Named("two")] IThing two) {}
}

class ThingConfig {}

class Thing(ThingConfig cfg) : IThing {}

And in my binder:
Bind<IThing>().To(typeof(Thing)).InSingletonScope().Named("one");
Bind<IThing>().To(typeof(Thing)).InSingletonScope().Named("two");
Bind<ThingConfig>().ToMethod(() => new ThingConfig()).InSingletonScope().Named("one");
Bind<ThingConfig>().ToMethod(() => new ThingConfig()).InSingletonScope().Named("two");

1 Ответ

0 голосов
/ 09 января 2019

Я думаю, что нашел приемлемое решение, включающее Named и WhenAnyAncestorNamed.

Я хотел, по сути, иметь «тег», который идентифицировал бы область, поэтому имя соответствует требованиям. Я хотел иметь возможность разрешать объект по имени или когда он вводится в объекты, активированные этим именем. Для этого мне пришлось дважды связать объект - один раз по имени и один раз для любого предка с таким именем:

Bind(interfaces.ToArray()).To(objectType).InSingletonScope().Named(name);
Bind(interfaces.ToArray()).ToMethod(
     ctx => ctx.Kernel.Get(ctx.Request.Service, name)).WhenAnyAncestorNamed(name);

Если кто-нибудь знает более изящное решение, я весь в ушах.

...