2009-07-20 110 views
12

我有一个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的新手,所以也许有一些明显的我失踪了。

我能想到的几种方法来解决这个问题:

  1. 实例化的MapView代码。从XAML中删除<MapView ... />,反而增加这GameWindow的构造:

    public GameWindow(IKernel kernel) { 
        root.Children.Add(kernel.Get<MapView>()); 
    } 
    

    缺点:额外从没有使用XAML的复杂性; GameWindow依赖于IKernel。

  2. 请XAML的实例,并使用属性注入,而不是:

    public GameWindow(IKernel kernel) { 
        kernel.Inject(mapView); 
    } 
    

    缺点:Ninject文档说进样()“不应该被用于大多数情况下”,所以我甚至不知道如果它符合我的想法,或者在这里使用它是否合理。 GameWindow仍然依赖于IKernel。

  3. 向GameWindow添加可注入的参数/属性,将值传递给MapView(可能通过MapView上的属性),然后使用Get<GameWindow>()。缺点:现在我手动将依赖关系传递到整个地方,这是DI框架应该为我自动执行的。

  4. 在实例化GameWindow之后,遍历逻辑树并调用IKernel.Inject()。缺点:我不知道Inject()是否按我认为的那样做,或者在这里是否合适。调用者必须记得在实例化一个GameWindow之后执行可视化树和注入的事情。

有没有更好的方法来做到这一点?也许一个WPF扩展Ninject,让我做一个Get<GameWindow>(),并自动为我走行逻辑树(如#4),做一切注入属性?如果这样的事情不存在,我可以写出来吗?

你们如何与WPF一起使用Ninject?你是否使用上述任何一种方法(如果是这样,你可以分享我不知道的事情)?你有更好的方法吗?

回答

4

1)是最好的。您还会发现它是Mapview函数的一个便捷入口点。并且,不是传入内核,而是执行kernel.Get < GameWindow>()和[inject] MapView在GameWindow中。

+0

注入控制本身从来没有发生过,但现在看起来很明显。谢谢! – 2009-07-21 02:20:30