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

时间:2016-02-26 07:12:57

标签: xamarin xamarin.forms

在我的便携式解决方案中,我有一个DependencyService接口IScanner

在我的Android解决方案中,我有两个实现此接口的类,即

public class Scanner1 : IScanner

public class Scanner2 : IScanner

所以,现在当我从便携式电话中调用DependencyService.Get<IScanner>()时,如何添加逻辑以发送上述实现之一?

3 个答案:

答案 0 :(得分:3)

DependencyService是一项非常有限的服务,专为特定目的而设计。您可以创建实现服务的Facade类,并使用基于运行时逻辑的两个实现之一(如果这是您的目标)。使用DependencyService而不是其他两个注册Facade。把立面的逻辑放在外立面。

对于更多功能,我建议您查看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和facade的快速示例如下。

[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();
}

答案 1 :(得分:0)

为了让DependencyService找到您的实现,您需要将一个程序集属性添加到包含注册它的类型的程序集中:

[assembly: Xamarin.Forms.Dependency(typeof(Scanner1))]

这不允许您使用运行时逻辑来决定使用哪个实现,但它允许您在编译时指定它。

答案 2 :(得分:0)

在调用Get方法之前,通过注册所需的类。

DependencyService.Register<IScanner,Scanner1>();

然后这将调用Scanner1类的GetSomething()方法:-

var x = DependencyService.Get<IScanner>().GetSomething();