问题描述
我有一个Xamarin.Forms应用程序,该应用程序使用Prism和DryIoC作为容器.我有一个值转换器,需要使用通过IContainerRegistry注册的服务.
I have a Xamarin.Forms app that uses Prism and DryIoC as the container. I have a value converter where I need to make use of a service I have registered via IContainerRegistry.
containerRegistry.RegisterSingleton<IUserService, UserService>();
由于IValueConverter是通过XAML而不是DryIoC构造的,因此该如何解决这种依赖性而不必诉诸构造函数注入?我可以在Prism/DryIoC中使用服务定位器吗?如果可以,怎么办?
How do I resolve that dependency without having to resort to constructor injection since IValueConverter gets constructed by XAML and not by DryIoC? Can I use a Service Locator in Prism/DryIoC? And if so, how?
下面是值转换器代码:
public class MyValueConverter : IValueConverter
{
private readonly IUserService _userService;
public MyValueConverter()
{
// Ideally, I can use a service locator here to resolve IUserService
//_userService = GetContainer().Resolve<IUserService>();
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var isUserLoggedIn = _userService.IsLoggedIn;
if (isUserLoggedIn)
// Do some conversion
else
// Do some other conversion
...
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
推荐答案
我建议您更新到7.1预览版,因为它可以解决此确切问题.您的转换器只是这样:
I would encourage you to update to the 7.1 preview as it solves this exact issue. Your converter would simply be like:
public class MyValueConverter : IValueConverter
{
private readonly IUserService _userService;
public MyValueConverter(IUserService userService)
{
_userService = userService;
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var isUserLoggedIn = _userService.IsLoggedIn;
if (isUserLoggedIn)
// Do some conversion
else
// Do some other conversion
...
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
您的XAML如下所示:
Your XAML then would look something like:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:converters="clr-namespace:DemoApp.Converters"
xmlns:ioc="clr-namespace:Prism.Ioc;assembly=Prism.Forms"
x:Class="DemoApp.Views.AwesomePage">
<ContentPage.Resources>
<ResourceDictionary>
<ioc:ContainerProvider x:TypeArguments="converters:MyValueConverter"
x:Key="myValueConverter" />
</ResourceDictionary>
</ContentPage.Resources>
</ContentPage>
请务必先查看发行说明尽管正在更新,因为该版本还包含一些重大更改.
Be sure to check out the release notes before updating though, as the release also contains some breaking changes.
这篇关于如何使用Prism/DryIoC解决Xamarin.Forms中IValueConverter中的依赖项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!