xamarin - 如果 Xamarin Forms DependencyService 有多个实现怎么办?

标签 xamarin xamarin.forms

在我的可移植解决方案中,我有一个 DependencyService 接口(interface) IScanner .

在我的 Android 解决方案中,我有 2 个类实现此接口(interface),即

public class Scanner1 : IScanner

public class Scanner2 : IScanner

所以,现在当我打电话DependencyService.Get<IScanner>()时从可移植,我如何添加逻辑来发送上述实现之一?

最佳答案

DependencyService 是一项非常有限的服务,并且是为特定目的而设计的。您可以创建一个外观类来实现该服务,并使用基于运行时逻辑的 2 个实现之一(如果这是您的目标)。使用 DependencyService 而不是其他两个注册外观。将使用哪个逻辑放在外观内部。

有关更多功能,我建议您查看 XLabs.Ioc 抽象层并从中选择众多 IOC 提供程序之一。我是它的作者,但即使您不使用抽象层,您也会从那里找到可能更适合您的需求的跨平台兼容的 DI 容器。

https://www.nuget.org/packages?q=xlabs.ioc

有关更多信息,我建议您查看 Matt 的文章,了解如何使用它:http://www.codenutz.com/autofac-ninject-tinyioc-unity-with-xamarin-forms-labs-xlabs/

下面是使用 DependencyService 和外观的快速示例。

[assembly: Dependency(typeof(ScannerFacade))]
namespace DiSample.Droid
{
    public class ScannerFacade : IScanner
    {
        private readonly IScanner primaryScanner;
        private readonly IScanner secondaryScanner;

        /// <summary>
        /// Default constructor so <see cref="DependencyService"/> can resolve.
        /// </summary>
        public ScannerFacade() : this(new Scanner1(), new Scanner2())
        {
        }

        public ScannerFacade(IScanner primaryScanner, IScanner secondaryScanner)
        {
            this.primaryScanner = primaryScanner;
            this.secondaryScanner = secondaryScanner;
        }

        public bool IsAvailable
        {
            get { return this.primaryScanner.IsAvailable || this.secondaryScanner.IsAvailable; }
        }

        public Task DoSomething()
        {
            if (this.primaryScanner.IsAvailable) return this.primaryScanner.DoSomething();
            if (this.secondaryScanner.IsAvailable) return this.secondaryScanner.DoSomething();

            throw new System.InvalidOperationException("No scanners are available.");
        }
    }
}

我用于示例的 IScanner 界面:

public interface IScanner
{
    bool IsAvailable { get; }
    Task DoSomething();
}

关于xamarin - 如果 Xamarin Forms DependencyService 有多个实现怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35645653/

相关文章:

ios - Xamarin.iOS 写入 NFC

xamarin - 有没有办法可以使用 Xamarin 表单向 Shell 选项卡区域添加左右边距?

c# - Xamarin.Forms 2.5.0 和上下文

c# - Xamarin.Android 点击手势和长按手势不能一起工作

android - Xamarin 中的 LayoutInDisplayCutoutMode 问题

android - 适用于 Android 的 Visual Studio 模拟器

macos - 使用 Xamarin Mac、C# 的跨浏览器、跨平台 native 消息传递

xamarin - 如何在屏幕中间显示 ActivityIndi​​cator?

ios - 在 Xamarin 中隐藏后退按钮文本

ios - 如何在 UiTableViewCell 中动态更改 ImageView?