Регистрация двух экземпляров одного типа с использованием одного и того же интерфейса - PullRequest
0 голосов
/ 24 мая 2018

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

для

kernel.Bind<IManifest>().To<Manifest>().InSingletonScope(); // first instance
kernel.Bind<IManifest>().To<Manifest>().InSingletonScope(); // second one

Как этого добиться?Я надеюсь, что должен быть какой-то способ дифференцировать их, используя какое-то свойство или что-то еще.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете использовать именованный синтаксис:

kernel.Bind<IManifest>().To<Manifest>().InSingletonScope().Named("ManifestA");
kernel.Bind<IManifest>().To<Manifest>().InSingletonScope().Named("ManifestB");

Затем получить его, вызвав:

kernel.Get<IWeapon>("ManifestA");

Или указать NamedAttribute в конструкторе.

public class ParentA
{
    public ParentA([Named("ManifestA")] IManifest manifest)
    {
        ....
    }
}

Затем вытакже может использовать синтаксис WhenInjectedInto.

kernel.Bind<IManifest>().To<Manifest>().WhenInjectedInto<ParentA>().InSingletonScope();
kernel.Bind<IManifest>().To<Manifest>().WhenInjectedInto<ParentB>().InSingletonScope();

Или синтаксис WhenParentNamed, если Parents одного типа:

kernel.Bind<Parent>().ToSelf().Named("ParentA");
kernel.Bind<Parent>().ToSelf().Named("ParentB");

kernel.Bind<IManifest>().To<Manifest>().WhenParentNamed("ParentA").InSingletonScope();
kernel.Bind<IManifest>().To<Manifest>().WhenParentNamed("ParentB").InSingletonScope();
...