2016-02-26 51 views
0

在我的便携式解决方案中,我有一个DependencyService接口IScanner如果Xamarin Forms DependencyService有多个实现会怎么样?

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

public class Scanner1 : IScanner 

public class Scanner2 : IScanner 

所以,现在当我打电话从便携式DependencyService.Get<IScanner>(),我怎么添加到发送上述实现的一个逻辑?

回答

0

为了使DependencyService找到您的实现,需要一个集属性添加到组件包含其注册类型:

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

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

3

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

对于更多功能,我建议您查看XLabs.Ioc抽象层,并从那里选择众多IOC提供者之一。我是它的作者,但即使你不使用抽象层,你也会从那里找到跨平台兼容的DI容器,可以更好地满足你的需求。

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

欲了解更多信息,我建议就如何使用它考虑看看马特的文章:使用DependencyService http://www.codenutz.com/autofac-ninject-tinyioc-unity-with-xamarin-forms-labs-xlabs/

快速样品和门面如下。

[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接口I用于例如:

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

非常感谢SKall。 我面临的问题是: 我有一个DependencyService调用IBarcodeScanner。 在我的android项目中,我有两种类型或条码扫描器实现IBarcodeScanner。 在运行时,我想检查哪个连接到设备并将相应的实现传递给依赖项服务。 – jonamreddy

+0

然后,您想要实现一个服务门面并使用依赖项服务进行注册。不要注册实际的实现,而是在外观中使用它们。 – SKall

+0

谢谢你SKall。我知道我问得太多了。但是,您能否提供这种方法的示例代码? – jonamreddy