在我的便携式解决方案中,我有一个DependencyService接口IScanner
。
在我的Android解决方案中,我有两个实现此接口的类,即
public class Scanner1 : IScanner
public class Scanner2 : IScanner
所以,现在当我从便携式电话中调用DependencyService.Get<IScanner>()
时,如何添加逻辑以发送上述实现之一?
答案 0 :(得分:3)
DependencyService是一项非常有限的服务,专为特定目的而设计。您可以创建实现服务的Facade类,并使用基于运行时逻辑的两个实现之一(如果这是您的目标)。使用DependencyService而不是其他两个注册Facade。把立面的逻辑放在外立面。
对于更多功能,我建议您查看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和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.");
}
}
}
我用于示例的IScanner接口:
public interface IScanner
{
bool IsAvailable { get; }
Task DoSomething();
}
答案 1 :(得分:0)
为了让DependencyService找到您的实现,您需要将一个程序集属性添加到包含注册它的类型的程序集中:
[assembly: Xamarin.Forms.Dependency(typeof(Scanner1))]
这不允许您使用运行时逻辑来决定使用哪个实现,但它允许您在编译时指定它。
答案 2 :(得分:0)
在调用Get方法之前,通过注册所需的类。
DependencyService.Register<IScanner,Scanner1>();
然后这将调用Scanner1类的GetSomething()方法:-
var x = DependencyService.Get<IScanner>().GetSomething();