我有一个带有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);
}
}
遇到错误:
答案 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()
。
某些框架(如Caliburn.Micro)允许您在某些情况下通过DI容器实例化某些视图。但是,这意味着这些控件不会出现在设计器中。他们只是空白。 例如,请参阅this answer
答案 1 :(得分:-1)