2016-02-26 65 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