在我看来,如何解决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>();
}
这对我来说似乎不是最佳的(例如,用于单元测试)。有没有办法统一整个解决过程,最好通过构造函数?
答案 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容器。但它们基本上都是一样的,只是有几个不同的花里胡哨。