0

在我看来,如何解决 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>();
}

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

4

1 回答 1

0

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

但是,当您开始拥有超过 3 个您想要特定于平台的接口时,就会出现问题。当您的 App 的构造函数开始变得比 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 容器。但它们基本上都是一样的,只是有一些不同的花里胡哨。

于 2015-10-01T18:18:14.470 回答