代码之家  ›  专栏  ›  技术社区  ›  Dan

Ninject无法解决WPF中的构造函数注入问题

  •  0
  • Dan  · 技术社区  · 7 年前

    我的WPF桌面应用程序正试图使用Ninject注入一些接口依赖项,如下所示。应用程序启动看起来是这样的,(我认为)自动生成的:

    void App_Startup(object sender, StartupEventArgs e)
    {
        IKernel _Kernel = new StandardKernel();
        _Kernel.Load(Assembly.GetExecutingAssembly());
    }
    

    然后我有一个 NinjectModel

    Bind<Inheritance.IWindowProvider>().To<WindowProvider>().InSingletonScope();
    

    IWindowProvider 在本例中,我还添加了 [Inject] 属性

    [Inject]
    public LoginDetailsVM (IWindowProvider windowProvider) {
        this.WindowProvider = windowProvider;
    }
    

    在别处 然后(在另一个虚拟机中),我想创建这个视图模型的一个实例:

    IKernel kernel = new StandardKernel();
    LoginDetailsVM loginDetails = kernel.Get<LoginDetailsVM>();
    

    激活iWindows Provider时出错

    没有匹配的绑定可用,

    我的初始搜索结果显示我正在实例化 StandardKernel

    当然,必须传递内核实例在某种程度上会挫败注入的一个要点?

    还有,是显式的吗 Get<T>() 是否有更好的隐式方法来调用注入的构造函数?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Scott Hannen    7 年前

    问题不是围绕内核传递,而是在哪里访问它。如果你在构图根之外引用它( App_Startup

    反过来,建立工厂是为了从容器中解决问题。但这是在你的合成根中建立的,工厂可以被一个不涉及容器的实现所取代。因此,您仍然可以说您的组件不依赖于容器,也不与容器通信。

    Here's some documentation 配置Ninject以向工厂提供实例。

        2
  •  0
  •   Dave    7 年前

    如果你这么做了

    Void a method (){
    Var dictionary = new dictionary ();
    
    dictionary.Add(typeof(IFOO), new Foo());
    }
    
    Void other_method(){
    
    Var dictionary = new dictionary ();
    IFOO instance =Dictionary[typeof(IFOO)];
    // would you expect this to work?
    }
    

    通常使用单例模式来提供对IOC容器的访问。