【WPF】Prism学习(九)

Prism Dependency Injection

1.Container Locator

1.1. Container Locator的引入

  • Container Locator是在Prism 8.0版本中新引入的一个特性。
  • 它的目的是为了帮助Prism框架摆脱对CommonServiceLocator的依赖,并解决一些必须回退到ServiceLocator模式的内部问题,比如在XAML扩展中。

1.2. ContainerLocator的好处

  • ContainerLocator对于使用Prism框架的开发者来说,尤其是那些开发跨平台应用(如Xamarin.Forms或Uno Platform)的开发者,提供了额外的好处。
  • 在某些情况下,开发者可能需要在初始化PrismApplication之前先初始化容器。一个常见的例子是使用Shiny框架的应用。在这种情况下,开发者可能希望将ServiceCollection添加到Prism容器中,然后将ServiceProvider返回给Shiny。这样,Prism和Shiny可以共同维护一个单一的容器,而不是拥有多个容器。

1.3. 对赞助Dan Siegel的开发者的特别说明

  • 对于那些赞助Dan Siegel的开发者,推荐使用Prism.Magician这个工具来实现上述功能。

2.如何使用Container Locator

2.1. 如何使用ContainerLocator

  • ContainerLocator可以通过一个委托(delegate)来延迟设置容器实例。这意味着,直到调用ContainerLocator.Container之前,容器不会被创建。

2.2. 示例代码

csharp 复制代码
var createContainerExtension = () => new DryIocContainerExtension();
ContainerLocator.SetContainerExtension(createContainerExtension);
  • 首先,定义一个委托createContainerExtension,当调用时会创建一个新的DryIocContainerExtension实例。
  • 然后,使用ContainerLocator.SetContainerExtension方法来设置这个委托。

2.3. 警告

  • 如果在设置创建委托之后,你没有调用ContainerLocator.CurrentContainerLocator.Container,那么后续对SetContainerExtension的调用将会覆盖你最初设置的委托。

强调了ContainerLocator的延迟创建特性,以及如何通过委托来设置容器实例。同时,提醒开发者在设置委托后需要调用相关方法,否则之前设置的委托可能会被新的调用覆盖。这是在使用ContainerLocator时需要注意的一个关键点。

3.高级用法

3.1. 高级用法:

  • 这部分内容仅适用于高级用户。这些API故意在智能感知( intellisense )中隐藏,因为它们不适用于普通用户。使用这些API时需要谨慎,并且只在正确的情境下使用。
  • 如果需要访问原始的IContainerExtension,可以通过访问ContainerLocator.Current来实现。

3.2. 测试:

  • 在单元测试中,通常建议重置ContainerLocator。这样可以确保容器被释放,容器实例和创建容器的委托都被清除,从而可以创建一个新的实例。
  • 给出了一个示例代码,展示了如何在测试类中实现IDisposable接口,并在Dispose方法中调用ContainerLocator.ResetContainer()来重置ContainerLocator。
csharp 复制代码
public class SomeTests : IDisposable
{
    public void Dispose()
    {
        ContainerLocator.ResetContainer();
    }
}

在使用高级API时需要谨慎,并在单元测试中重置ContainerLocator以确保容器被正确释放和清理。这对于确保测试的准确性和可靠性非常重要。

4.用法示例

4.1在ShinyStartup中

csharp 复制代码
public class MyStartup : ShinyStartup
{
    private void RegisterTypes(IContainerRegistry container)
    {
        // Your normal registrations here...
    }

    private IContainerExtension CreateContainerExtension() =>
        new DryIocContainerExtension();

    public override IServiceProvider CreateServiceProvider(IServiceCollection services)
    {
        ContainerLocator.SetContainerExtension(CreateContainerExtension);
        var container = ContainerLocator.Container;
        container.RegisterServices(services);
        RegisterTypes(container);
        return container.GetContainer();
    }
}

4.2在XAML扩展中

csharp 复制代码
public class SomeMarkupExtension : IMarkupExtension
{
    private static readonly Lazy<IEventAggregator> _lazyEventAggregator =
        new Lazy<IEventAggregator>(() => ContainerLocator.Container.Resolve<IEventAggregator>());

    private IEventAggregator EventAggregator => _lazyEventAggregator.Value;

    public object ProvideValue(IServiceProvider provider)
    {
        // your logic here...
    }
}

相关链接

相关推荐
星星火柴93613 分钟前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
小狗爱吃黄桃罐头14 分钟前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
艾莉丝努力练剑1 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
武昌库里写JAVA2 小时前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
杜子不疼.3 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
小幽余生不加糖3 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频
✎ ﹏梦醒͜ღ҉繁华落℘4 小时前
开发WPF项目时遇到的问题总结
wpf
..过云雨4 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
myzzb4 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
非凡ghost7 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求