附录
Prism容器扩展
Prism开箱即用的注册方法覆盖了大多数的依赖注入场景。事实上,除了注册页面用于导航之外,许多项目永远不需要做更多的事情,只需将服务注册为瞬态(Transient)或单例(Singleton)。然而,有时您可能还需要执行以下操作:
- 使用工厂方法注册类型
- 为多个服务注册一个实现类型
- 如果您将其注册为瞬态,这可以简单地使用Prism完成,但是容器扩展可以让您使用一行代码完成此操作
- 您可能还需要服务是单例的,并且无论解析哪个接口都使用相同的实例
除此之外,您可能希望利用容器扩展中的Prism.Forms的扩展版本,因为这提供了更多的默认内置调试函数(钩子),以便为您提供有关应用程序中遇到未捕获异常的更好上下文。更多有关信息,请查看Prism.Container.Extensions库
支持Shiny库
对于Xamarin开发人员来说,来自Allan Ritchie的Shiny Library无疑是最好的新库之一。它提供了许多功能,包括管理设置、确定是否连接到网络、后台任务和蓝牙等。而且Shiny从一开始就考虑到使用依赖注入。这会有很多好处,包括它使用基于接口的方法,并允许您模拟任何从Shiny中注入到ViewModels中的服务。
Shiny的一个缺点是它需要在Xamarin.Forms或Prism初始化之前进行初始化。这从根本上改变了依赖注入的真实来源。因此为了正确组合Prism和Shiny,您需要正确提供依赖注入容器作为Shiny将要使用的IServiceProvider。最简单的方法是使用来自Prism.Container.Extensions的容器实现以及来自同一存储库Shiny.Prism的NuGet包。
[!注意] 如果您使用窗口扩展包(Prism.DryIoc.Forms.Extended或Prism.Unity.Forms.Extended),则不应使用Prism中的容器特定包(Prism.DryIoc.Forms或Prism.Unity.Forms)作为PrismApplication,因为在这些包中已经配置使用了正确的PrismContainerExtension。
您可以选择直接将Prism.Forms与其中一个容器扩展包一起使用。如果这样做,您将需要按如下方式更新您的应用程序:
public partial class App : PrismApplicationBase
{
protected override IContainerExtension CreateContainerExtension() =>
PrismContainerExtension.Current;
}
使用Shiny.Prism中的Startup基类,您只需按如下方式提供容器扩展:
public class Startup : PrismStartup
{
public Startup()
: base(PrismContainerExtension.Current)
{
}
protected override void ConfigureServices(IServiceCollection services)
{
// Register any types you need to with Shiny
}
}