WPF代码背后的Ninject属性注入

时间:2015-07-28 14:08:50

标签: c# wpf ninject

我有一个带有Ninject作为DI容器的WPF应用程序。我在App.xaml.cs中添加了以下代码:

public partial class App : Application
{
    private IKernel container;

    protected override void OnStartup(StartupEventArgs e)
    {
        ConfigureContainer();
        base.OnStartup(e);
    }

    private void ConfigureContainer()
    {
        this.container = new StandardKernel();
        this.container.Bind<IAccountTypeRepository>().To<AccountTypeRepository>();
        this.container.Bind<IMainWindow>().To<MainWindow>();
        var mainWindow = this.container.Get<IMainWindow>();
        mainWindow.Show();
    }
}

当我尝试在UserControl后面的代码中调用IAccountTypeRepository时,它会抛出一个null异常。你可以帮助我的代码中缺少什么。非常感谢。我需要将它作为Property Injection。

public interface IAccountTypeRepository
{
    void Update(SqlParameter[] param);

    DataTable GetAll(SqlParameter[] param);
}



public class AccountTypeRepository : IAccountTypeRepository
{
    public void Update(SqlParameter[] param)
    {
        var sqlRepository = new SqlRepository();
        sqlRepository.ExecuteNonQuery("MyStoredProc", param);
    }


    public DataTable GetAll(SqlParameter[] param)
    {
        var sqlRepository = new SqlRepository();

        return sqlRepository.ExecuteDataTable("MyStoredProc", param);
    }
}

遇到错误:

enter image description here

2 个答案:

答案 0 :(得分:1)

当XAML解析器创建一个对象时,它不会通知DI容器(ninject)它正在这样做。所以ninject无法发挥它的魔力。这意味着您必须手动调用kernel.Inject(myUserControl)来注入myUserControls属性。

另外

一旦构造函数完成,该对象才存在。因此,在执行构造函数之后会发生属性注入。因此,您无法从构造函数访问属性注入的值。

如果你想在实例化后执行某些逻辑,你可以做的如下:

public partial class Window
{
...
    public void Initialize()
    {
    ... that's where the logic goes...
    }
...
}

Bind<IWindow>().To<Window>()
    .OnActivation(x => x.Initialize());

传递给OnActivation的委托将在创建对象后执行。每个对象只调用一次。因此,如果你有InSingletonScope()绑定并在多个位置注入对象,激活方法仍然只会被调用一次。

但是当对象由XAML解析器实例化并且您在其上调用kernel.Inject(...)时,这也无效。但是,既然您已拨打kernel.Inject(...),您也可以自己致电foo.Initialize()

通过DI容器实例化视图

某些框架(如Caliburn.Micro)允许您在某些情况下通过DI容器实例化某些视图。但是,这意味着这些控件不会出现在设计器中。他们只是空白。 例如,请参阅this answer

答案 1 :(得分:-1)

使用NinjectModule,您的问题将得到解决。

请看一下以下链接。

https://github.com/ninject/Ninject/wiki/Modules-and-the-Kernel