2017-12-18 168 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实例。 –