![](/img/trans.png)
[英]injecting viewmodel class without parameterless constructor in WPF with NInject
[英]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的一個新手,所以也許有一些我很想念的東西。
我可以想到幾種方法來解決這個問題:
在代碼中實例化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文檔說Inject()“不應該用於大多數情況”,所以我甚至不知道它是否符合我的想法,或者在這里使用它是否有意義。 並且GameWindow仍然依賴於IKernel。
向GameWindow添加可注入參數/屬性,將值傳遞給MapView(可能通過MapView上的屬性),然后使用Get<GameWindow>()
。 缺點:現在我手動傳遞依賴關系,這就是DI框架應該為我自動化。
在實例化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.