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>();
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?
Below is the value converter code:
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();
}
}
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();
}
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With