我有一个WPF UserControl,我想注入依赖关系。与Ninject一起做这件事的最好方法是什么?使用Ninject向WPF注入依赖关系
举一个具体的例子:我有一个名为MapView的UserControl,我想通过构造函数或属性注入将IDialogueService的一个实例注入到它中。目前,我没有使用任何依赖注入,并在XAML创建我的控制:
<Window x:Class="GameWindow" ...>
<Grid Name="root">
<MapView x:Name="mapView" ... />
<!-- other stuff here -->
</Grid>
</Window>
创建的iKernel,并绑定IDialogueService,很简单就够了。但我坚持如何使用内核将依赖注入到我的MapView中。我仍然是Ninject的新手,所以也许有一些明显的我失踪了。
我能想到的几种方法来解决这个问题:
实例化的MapView代码。从XAML中删除
<MapView ... />
,反而增加这GameWindow的构造:public GameWindow(IKernel kernel) { root.Children.Add(kernel.Get<MapView>()); }
缺点:额外从没有使用XAML的复杂性; GameWindow依赖于IKernel。
请XAML的实例,并使用属性注入,而不是:
public GameWindow(IKernel kernel) { kernel.Inject(mapView); }
缺点:Ninject文档说进样()“不应该被用于大多数情况下”,所以我甚至不知道如果它符合我的想法,或者在这里使用它是否合理。 GameWindow仍然依赖于IKernel。
向GameWindow添加可注入的参数/属性,将值传递给MapView(可能通过MapView上的属性),然后使用
Get<GameWindow>()
。缺点:现在我手动将依赖关系传递到整个地方,这是DI框架应该为我自动执行的。在实例化GameWindow之后,遍历逻辑树并调用IKernel.Inject()。缺点:我不知道Inject()是否按我认为的那样做,或者在这里是否合适。调用者必须记得在实例化一个GameWindow之后执行可视化树和注入的事情。
有没有更好的方法来做到这一点?也许一个WPF扩展Ninject,让我做一个Get<GameWindow>()
,并自动为我走行逻辑树(如#4),做一切注入属性?如果这样的事情不存在,我可以写出来吗?
你们如何与WPF一起使用Ninject?你是否使用上述任何一种方法(如果是这样,你可以分享我不知道的事情)?你有更好的方法吗?
注入控制本身从来没有发生过,但现在看起来很明显。谢谢! – 2009-07-21 02:20:30