解决依赖关系/构造函数注入的统一方法

时间:2015-10-01 09:52:49

标签: xamarin.forms xamarin.forms.labs xlabs

在我看来,如何解决XLabs中的依赖性有点令人困惑。

根据示例项目,这里是我如何注册依赖项(简化):

1)MainActivity.cs中的平台依赖

private void SetIoc()
{
    var resolverContainer = new SimpleContainer();
    resolverContainer.Register<IMediaPicker, MediaPicker>();
    Resolver.SetResolver(resolverContainer.GetResolver());
}

2)App.cs中的平台独立

public App ()
{
    DependencyService.Register<ISettings, Settings>();
    DependencyService.Register<FooViewModel>();
}

现在,解决依赖关系变得相当困难。预期的方法是通过构造函数注入来解决,它以例外结束:

public FooViewModel(IMediaPicker picker) {} // Exception
public FooViewModel(ISettings settings) {} // Exception

另一种但不是最佳的方法是通过DependencyService / Resover解决。但在这里我需要知道我必须使用哪个:

public FooViewModel()
{
    _picker = Resolver.Resolve<IMediaPicker>();
    _settings = DependencyService.Get<ISettings>();
}

这对我来说似乎不是最佳的(例如,用于单元测试)。有没有办法统一整个解决过程,最好通过构造函数?

1 个答案:

答案 0 :(得分:0)

Theres没有理由不将您的实现放在构造函数中并将它们传递给堆栈。在PCL中定义接口在Android或IOS特定项目中实现它,并将其传递到APP构造函数的PCL中。它会工作正常。

问题出现了,但是当你开始拥有超过3个接口时,你想要特定于平台。当您的应用程序的构造函数开始变长,然后您的MainPage的构造函数可能会开始寻找其他选项。

DependencyService是Xamarin Forms为您提供的简单低球容器。您可以将其用于特定于平台或在PCL中。它需要简单的形式。您注册了接口以及要用于它的实现,然后您可以在PCL或平台特定代码中的任何位置检索实现的新实例。它使用起来很简单。 注册

DependencyService.Register<IMyInterface,MyClass> ();  

获取MyClass的实例只需调用

IMyInterface me = DependencyService.Get<IMyInterface> ();

我将是一个全新的宝贝MyClass。

您也可以在特定于平台的代码中调用它。

DependencyService.Register<IMyInterface,MyAndroidVersion> (); 

然后在你的PCL中

IMyInterface me = DependencyService.Get<IMyInterface> ();

会给你MyAndroid版本。

XLabs Container以同样的方式工作,只是为您提供更多选择。你不必同时使用两者我建议反对它。选择三个选项之一并使用它。如果你从前两个开始,你最终可能会长大,所以XLabs可能是最好的选择。

我个人使用MVVMLight的SimpleIOC容器。但它们基本上都是一样的,只是有几个不同的花里胡哨。