簡體   English   中英

使用Ninject將依賴項注入WPF

[英]Injecting dependencies into WPF using Ninject

我有一個WPF UserControl,我想將依賴項注入其中。 使用Ninject做到這一點的最佳方法是什么?

舉一個具體的例子:我有一個名為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文檔說Inject()“不應該用於大多數情況”,所以我甚至不知道它是否符合我的想法,或者在這里使用它是否有意義。 並且GameWindow仍然依賴於IKernel。

  3. 向GameWindow添加可注入參數/屬性,將值傳遞給MapView(可能通過MapView上的屬性),然后使用Get<GameWindow>() 缺點:現在我手動傳遞依賴關系,這就是DI框架應該為我自動化。

  4. 在實例化GameWindow之后,遍歷邏輯樹並在所有內容上調用IKernel.Inject()。 缺點:再次,我不知道Inject()是否符合我的想法,或者它是否合適。 調用者必須記住在實例化GameWindow之后執行walk-the-visual-tree-and-stuff。

有一個更好的方法嗎? 也許Ninject的WPF擴展允許我做一個Get<GameWindow>() ,並為我自動Get<GameWindow>()邏輯樹(如#4),對所有內容進行屬性注入? 如果不存在這樣的事情,我可以寫出來嗎?

你們如何在WPF中使用Ninject? 你是否使用上述任何一種方法(如果是這樣,你可以分享我不知道的情況)嗎? 你有更好的方法嗎?

1)是最好的。 您還會發現它是Mapview功能的便捷入口點。

另外,不要傳入內核,只需在GameWindow中執行kernel.Get <GameWindow>()和[inject] MapView。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM