在我的可移植解决方案中,我有一个 DependencyService 接口(interface) IScanner
.
在我的 Android 解决方案中,我有 2 个类实现此接口(interface),即
public class Scanner1 : IScanner
public class Scanner2 : IScanner
所以,现在当我打电话DependencyService.Get<IScanner>()
时从可移植,我如何添加逻辑来发送上述实现之一?
最佳答案
DependencyService 是一项非常有限的服务,并且是为特定目的而设计的。您可以创建一个外观类来实现该服务,并使用基于运行时逻辑的 2 个实现之一(如果这是您的目标)。使用 DependencyService 而不是其他两个注册外观。将使用哪个逻辑放在外观内部。
有关更多功能,我建议您查看 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 和外观的快速示例。
[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();
}
关于xamarin - 如果 Xamarin Forms DependencyService 有多个实现怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35645653/