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();
}
非常感谢SKall。 我面临的问题是: 我有一个DependencyService调用IBarcodeScanner。 在我的android项目中,我有两种类型或条码扫描器实现IBarcodeScanner。 在运行时,我想检查哪个连接到设备并将相应的实现传递给依赖项服务。 – jonamreddy
然后,您想要实现一个服务门面并使用依赖项服务进行注册。不要注册实际的实现,而是在外观中使用它们。 – SKall
谢谢你SKall。我知道我问得太多了。但是,您能否提供这种方法的示例代码? – jonamreddy