【问题标题】:Using ninject as a WPF view mode locator - viewmodels as singletons使用 ninject 作为 WPF 视图模式定位器 - 视图模型作为单例
【发布时间】:2015-10-19 09:01:31
【问题描述】:

我在 WPF 应用程序中使用 ninject 的内核作为视图模型定位器。

内核帮助类:

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&lt;MainWindowViewModel&gt;() 将始终返回一个新实例。有没有办法让它只适用于一个实例?

【问题讨论】:

    标签: c# wpf mvvm ninject viewmodellocator


    【解决方案1】:

    如果你在Ninject中设置了绑定,可以调用InSingletonScope方法:

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

    在您的情况下(您没有视图模型的界面),它可能是:

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


    更多信息请看这里:Object Scopes in Ninject

    【讨论】:

    • 我建议对原始代码进行一个小的改进:他使用静态类作为内核的包装器。如果将其更改为实现接口的常规类,则可以使用 InSingletonScope 将该接口绑定到实现,并让注入器将自身注入到需要它的类中。
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多