如果Xamarin Forms DependencyService有多个实现呢?

如果Xamarin Forms DependencyService有多个实现呢?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,在我的便携式解决方案中,我有一个DependencyService接口IScanner 在我的Android解决方案中,我有两个类实现这个接口,即 public class Scanner1 : IScanner public class Scanner2 : IScanner 那么,现在当我从portable调用DependencyService.Get()时,如何添加逻辑以发送上述实现之一?为了让DependencyService找到您的实现,您需要向包含注册它的类型的程序集添加一个as

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

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

public class Scanner1 : IScanner

public class Scanner2 : IScanner

那么,现在当我从portable调用
DependencyService.Get()
时,如何添加逻辑以发送上述实现之一?

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

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

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

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

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

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

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

关于更多特性,我建议您研究XLabs.Ioc抽象层,并从中选择一个Ioc提供者。我是这本书的作者,但即使您不使用抽象层,您也会从中找到更适合您需要的跨平台兼容DI容器

有关更多信息,我建议看一下Matt关于如何使用它的文章:

下面是使用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.");
        }
    }
}

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

关于更多特性,我建议您研究XLabs.Ioc抽象层,并从中选择一个Ioc提供者。我是这本书的作者,但即使您不使用抽象层,您也会从中找到更适合您需要的跨平台兼容DI容器

有关更多信息,我建议看一下Matt关于如何使用它的文章:

下面是使用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.");
        }
    }
}

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

DependencyService.Register<IScanner,Scanner1>();
DependencyService.Register();
然后调用Scanner1类的GetSomething()方法:-

var x = DependencyService.Get<IScanner>().GetSomething();
var x=DependencyService.Get().GetSomething();
在调用Get方法之前注册所需的类

DependencyService.Register<IScanner,Scanner1>();
DependencyService.Register();
然后调用Scanner1类的GetSomething()方法:-

var x = DependencyService.Get<IScanner>().GetSomething();
var x=DependencyService.Get().GetSomething();
非常感谢大家。我面临的问题是:我有一个称为IBarcodeScanner的DependencyService。在我的android项目中,我有两种类型或条形码扫描仪实现IBarcodeScanner。在运行时,我希望检查哪个连接到设备,并将适当的实现传递给依赖项服务。然后您希望实现一个服务facade,并将其注册到依赖项服务。不要注册实际的实现,而是在facade中使用它们。谢谢。我知道我要求太多了。但是,您能提供这种方法的示例代码吗?我在上面编辑了我的答案。正如我所说的,我不推荐DependencyService使用这种功能,因为它很快就会变得复杂且相当不灵活。从长远来看,配置一个更完整的DI容器是一个更好的解决方案。非常感谢SKall:)非常感谢SKall。我面临的问题是:我有一个称为IBarcodeScanner的DependencyService。在我的android项目中,我有两种类型或条形码扫描仪实现IBarcodeScanner。在运行时,我希望检查哪个连接到设备,并将适当的实现传递给依赖项服务。然后您希望实现一个服务facade,并将其注册到依赖项服务。不要注册实际的实现,而是在facade中使用它们。谢谢。我知道我要求太多了。但是,您能提供这种方法的示例代码吗?我在上面编辑了我的答案。正如我所说的,我不推荐DependencyService使用这种功能,因为它很快就会变得复杂且相当不灵活。从长远来看,配置更完整的DI容器是一个更好的解决方案。非常感谢SKall:)