棱镜WPF - 如何访问UserControls或自定义控件中的ServiceLocator
我有一些可重用的UserControls,在那些UserControls内我想访问一些服务实例,这些实例是我在bootstrapper中注册的。棱镜WPF - 如何访问UserControls或自定义控件中的ServiceLocator
我不能做构造函数注入,因为这些用户控件直接在xaml中使用,所以我试图访问ServiceLocator.Current
,但它抛出异常。
那么访问用户控件中的注册服务实例的最佳做法是什么?您不能执行构造函数注入,因为WPF需要无参数构造函数在xaml中加载它们。
(顺便说一句,我使用UnityBootstrapper)
您可以创建一个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;
}
}
因此,您的第二个选项(静态引用)与使用ServiceLocator.Current相同。但它不起作用。我想知道为什么。 –
ilspy显示ServiceLocator.Current返回在SetLocatorProvider方法中设置的ServiceLocator.currentProvider。可能我们预计在使用.Current之前调用此方法进行设置。 (ServiceLocator.SetLocatorProvider) – Milan
UnityBootstrapper已经设置了Servicelocator.Current。而且我已经可以在viewmodels中使用它了。但是当谈到自定义用户控件时,我无法获得Servicelocator.Current实例。 –
“的用户控件内”是指在代码隐藏?什么阻止你使用(自动连线)视图模型(它具有在ist构造函数中注入的所有内容)? – Haukinger
你的用户控件位于哪里?在shell窗口中? – mm8
@Haukinger,“使用自动连线的视图模型并使用构造函数注入”是我的后备理念。这意味着如果我找不到其他解决方案,我会这样。我想知道所有棱镜人员如何做这种工作,最佳做法是什么。 –