2015-10-19 2 views
1

Я использую ядро ​​ninject как локатор viewmodel в приложении WPF.Использование ninject в качестве локатора режима просмотра WPF - viewmodels as singletons

Хелпер ядро ​​класса:

public static class IoCKernel 
    { 
     private static IKernel kernel; 

     public static void Init(params NinjectModule[] modules) 
     { 
      if (kernel == null) 
      { 
       kernel = new StandardKernel(modules); 
      } 
     } 

     public static T Get<T>() 
     { 
      return kernel.Get<T>(); 
     } 
    } 

И ViewModelLocator выставляет Get метод, как:

public class ViewModelLocator : IViewModelLocator 
    {  
     public MainWindowViewModel MainWindowViewModel 
     { 
      get 
      { 
       return IoCKernel.Get<MainWindowViewModel>(); 
      } 
     } 
    } 

И когда экземпляр нужно, это называется как:

IoCKernel.Get<IViewModelLocator>().MainWindowViewModel; 

Однако, IoCKernel.Get<MainWindowViewModel>() всегда будет возвращать новый i nstance. Есть ли способ заставить его работать только с одним экземпляром?

ответ

4

Если вы настроили связывание в Ninject, вы можете вызвать InSingletonScope метод:

Bind<IYourInterface>().To<YourClass>().InSingletonScope(); 

В вашем случае (не имеют интерфейс для модели вида) может быть:

Bind<MainWindowViewModel>().ToSelf().InSingletonScope(); 


Смотрите здесь для получения дополнительной информации: Object Scopes in Ninject

+0

Одним из незначительных улучшений я бы предложил исходный код: он использует статический класс в качестве оболочки для ядра. Если вы измените это на обычный класс, который реализует интерфейс, вы можете связать этот интерфейс с реализацией с помощью InSingletonScope и ввести инжектор в классы, которые в нем нуждаются. –