如果Xamarin Forms DependencyService有多个实现呢?
在我的便携式解决方案中,我有一个DependencyService接口如果Xamarin Forms DependencyService有多个实现呢?,xamarin,xamarin.forms,Xamarin,Xamarin.forms,在我的便携式解决方案中,我有一个DependencyService接口IScanner 在我的Android解决方案中,我有两个类实现这个接口,即 public class Scanner1 : IScanner public class Scanner2 : IScanner 那么,现在当我从portable调用DependencyService.Get()时,如何添加逻辑以发送上述实现之一?为了让DependencyService找到您的实现,您需要向包含注册它的类型的程序集添加一个as
IScanner
在我的Android解决方案中,我有两个类实现这个接口,即
public class Scanner1 : IScanner
public class Scanner2 : IScanner
那么,现在当我从portable调用
DependencyService.Get()
时,如何添加逻辑以发送上述实现之一?为了让DependencyService找到您的实现,您需要向包含注册它的类型的程序集添加一个assembly属性:
[assembly: Xamarin.Forms.Dependency(typeof(Scanner1))]
这不允许您使用运行时逻辑来决定使用哪个实现,但允许您在编译时指定它。为了让DependencyService找到您的实现,您需要向包含注册它的类型的程序集添加一个程序集属性:
[assembly: Xamarin.Forms.Dependency(typeof(Scanner1))]
这不允许您使用运行时逻辑来决定要使用哪个实现,但允许您在编译时指定它。DependencyService是一个非常有限的服务,它是为特定目的而设计的。您可以创建一个facade类来实现该服务,并使用基于运行时逻辑的两种实现之一(如果这是您的目标的话)。使用DependencyService而不是其他两个注册facade。将使用哪一个的逻辑放在门面内 关于更多特性,我建议您研究XLabs.Ioc抽象层,并从中选择一个Ioc提供者。我是这本书的作者,但即使您不使用抽象层,您也会从中找到更适合您需要的跨平台兼容DI容器 有关更多信息,我建议看一下Matt关于如何使用它的文章: 下面是使用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.");
}
}
}
DependencyService是一项非常有限的服务,专门为特定目的而设计。您可以创建一个facade类来实现该服务,并使用基于运行时逻辑的两种实现之一(如果这是您的目标的话)。使用DependencyService而不是其他两个注册facade。将使用哪一个的逻辑放在门面内 关于更多特性,我建议您研究XLabs.Ioc抽象层,并从中选择一个Ioc提供者。我是这本书的作者,但即使您不使用抽象层,您也会从中找到更适合您需要的跨平台兼容DI容器 有关更多信息,我建议看一下Matt关于如何使用它的文章: 下面是使用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.");
}
}
}
通过在调用Get方法之前注册所需的类
DependencyService.Register<IScanner,Scanner1>();
DependencyService.Register();
然后调用Scanner1类的GetSomething()方法:-
var x = DependencyService.Get<IScanner>().GetSomething();
var x=DependencyService.Get().GetSomething();
在调用Get方法之前注册所需的类
DependencyService.Register<IScanner,Scanner1>();
DependencyService.Register();
然后调用Scanner1类的GetSomething()方法:-
var x = DependencyService.Get<IScanner>().GetSomething();
var x=DependencyService.Get().GetSomething();
非常感谢大家。我面临的问题是:我有一个称为IBarcodeScanner的DependencyService。在我的android项目中,我有两种类型或条形码扫描仪实现IBarcodeScanner。在运行时,我希望检查哪个连接到设备,并将适当的实现传递给依赖项服务。然后您希望实现一个服务facade,并将其注册到依赖项服务。不要注册实际的实现,而是在facade中使用它们。谢谢。我知道我要求太多了。但是,您能提供这种方法的示例代码吗?我在上面编辑了我的答案。正如我所说的,我不推荐DependencyService使用这种功能,因为它很快就会变得复杂且相当不灵活。从长远来看,配置一个更完整的DI容器是一个更好的解决方案。非常感谢SKall:)非常感谢SKall。我面临的问题是:我有一个称为IBarcodeScanner的DependencyService。在我的android项目中,我有两种类型或条形码扫描仪实现IBarcodeScanner。在运行时,我希望检查哪个连接到设备,并将适当的实现传递给依赖项服务。然后您希望实现一个服务facade,并将其注册到依赖项服务。不要注册实际的实现,而是在facade中使用它们。谢谢。我知道我要求太多了。但是,您能提供这种方法的示例代码吗?我在上面编辑了我的答案。正如我所说的,我不推荐DependencyService使用这种功能,因为它很快就会变得复杂且相当不灵活。从长远来看,配置更完整的DI容器是一个更好的解决方案。非常感谢SKall:)