Ninject: вызывать метод с каждым вызовом Get - PullRequest
1 голос
/ 16 апреля 2019

У меня есть Singleton Binding для Ninject, и я хотел бы вызывать метод всякий раз, когда DI разрешает его (т.е. с каждым вызовом Get). Ninject имеет метод OnActivation, который вызывается только при разрешении объекта.

Я знаю, что использование Transient будет интуитивным решением, но по неконтролируемой причине. Объект должен быть одноэлементным.

1 Ответ

1 голос
/ 19 апреля 2019

Вы можете достичь этого с помощью некоторых хитростей. Позвольте привести пример:

const string Name = "Foo";

// Singleton Binding. Will only be used when the context uses the {Name}
Bind<Foo>().To<Foo>()
    .Named(Name)
    .InSingletonScope();

// Unnamed binding with method call on each resolution
Bind<Foo>().ToMethod(ctx => 
    {
        // Do anything arbitrary here. like calling a method...
        return ctx.Kernel.Get<Foo>(Name));
    });

Когда ядро ​​запрашивает Foo (без имени), оно преобразуется в привязку ToMethod, куда вы можете вставить любой произвольный код, который вам нравится. В конце метод должен использовать ядро ​​для запроса Foo, но на этот раз с условием имени. Это разрешит указанную привязку синглтона.

...