У нас есть конкретная однопользовательская услуга, которая реализует Ninject.IInitializable
и 2 интерфейса. Проблема в том, что службы Initialize-methdod вызывают 2 раза, когда требуется только одно. Мы используем .NET 3.5 и Ninject 2.0.0.0.
Есть ли шаблон в Ninject, чтобы это не происходило. Ни один из интерфейсов не реализует Ninject.IInitializable
. класс службы:
public class ConcreteService : IService1, IService2, Ninject.IInitializable
{
public void Initialize()
{
// This is called twice!
}
}
И модуль выглядит следующим образом:
public class ServiceModule : NinjectModule
{
public override void Load()
{
this.Singleton<Iservice1, Iservice2, ConcreteService>();
}
}
где Singleton - это метод расширения, определенный следующим образом:
public static void Singleton<K, T>(this NinjectModule module) where T : K
{
module.Bind<K>().To<T>().InSingletonScope();
}
public static void Singleton<K, L, T>(this NinjectModule module)
where T : K, L
{
Singleton<K, T>(module);
module.Bind<L>().ToMethod(n => n.Kernel.Get<T>());
}
Конечно, мы могли бы добавить инициализированный элемент bool в ConcreteService и инициализировать только тогда, когда он является ложным, но, похоже, он немного взломан. И это потребует повторения одной и той же логики в каждой службе, которая реализует два или более интерфейсов.
Спасибо за ответы! Я узнал что-то от всех! (Мне сложно определить, какая из них правильная).
Мы закончили создание интерфейса IActivable и расширение ядра ninject (он также удалил хорошо зависимые зависимости уровня кода до ninject, все атрибуты все еще остаются).