2017-12-18 174 views
0

我有一些可重用的UserControls,在那些UserControls內我想訪問一些服務實例,這些實例是我在bootstrapper中註冊的。棱鏡WPF - 如何訪問UserControls或自定義控件中的ServiceLocator

我不能做構造函數注入,因爲這些用戶控件直接在xaml中使用,所以我試圖訪問ServiceLocator.Current,但它拋出異常。

那麼訪問用戶控件中的註冊服務實例的最佳做法是什麼?您不能執行構造函數注入,因爲WPF需要無參數構造函數在xaml中加載它們。

(順便說一句,我使用UnityBootstrapper)

+0

「的用戶控件內」是指在代碼隱藏?什麼阻止你使用(自動連線)視圖模型(它具有在ist構造函數中注入的所有內容)? – Haukinger

+0

你的用戶控件位於哪裏?在shell窗口中? – mm8

+0

@Haukinger,「使用自動連線的視圖模型並使用構造函數注入」是我的後備理念。這意味着如果我找不到其他解決方案,我會這樣。我想知道所有棱鏡人員如何做這種工作,最佳做法是什麼。 –

回答

0

您可以創建一個DependencyProperty IUnityContainer,爲你控制一個實例給它在XAML:

<local:MyControl UnityContainer="{Binding Container}"/> 

現在,您可以訪問它的MyControl內。這會做什麼?

我的團隊喜歡對容器使用靜態引用,但我們只允許在轉換器中使用它。也許你可以在這種情況下使用它:

<local:MyControl UnityContainer="{UnityContainer}"/> 

這是你需要做這個選項的工作是什麼:

public static class MarkupExtensionHost 
{ 
    public static IUnityContainer Container { get; set; } 
} 

public class UnityContainerExtension : MarkupExtension 
{ 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return MarkupExtensionHost.Container; 
    } 
} 
+0

因此,您的第二個選項(靜態引用)與使用ServiceLocator.Current相同。但它不起作用。我想知道爲什麼。 –

+0

ilspy顯示ServiceLocator.Current返回在SetLocatorProvider方法中設置的ServiceLocator.currentProvider。可能我們預計在使用.Current之前調用此方法進行設置。 (ServiceLocator.SetLocatorProvider) – Milan

+0

UnityBootstrapper已經設置了Servicelocator.Current。而且我已經可以在viewmodels中使用它了。但是當談到自定義用戶控件時,我無法獲得Servicelocator.Current實例。 –