【WPF】Prism学习(八)

Prism Dependency Injection

1.处理解析错误

1.1. 处理解析错误

  • 这个特性是在Prism 8中引入的,如果你的应用目标是早期版本,则不适用。

1.2. 异常发生的原因

  • 开发者可能会遇到多种原因导致的异常,常见的错误包括未注册的服务或无效的XAML,这些在视图解析时会引发异常。

1.3. Prism容器扩展

  • Prism容器扩展现在会非常刻意地捕获任何底层容器异常,并抛出一个ContainerResolutionException

1.4. ContainerResolutionException的目标

  • 通过提供你需要的信息来缩短开发循环,帮助你诊断和修复代码中的问题。

1.5. ContainerResolutionException包含的内容

  • 它包含一些常量消息,如MissingRegistrationCannotResolveAbstractTypeCyclicalDependency
  • 除了这些常量,它还暴露了正在解析的服务名称(ServiceName)和服务类型(ServiceType)的属性。

1.6. 代码示例

csharp 复制代码
public class ModuleA : IModule
{
    private IServiceIForgotToRegister IAmADunce { get; }

    public ModuleA(IServiceIForgotToRegister iAmADummy)
    {
        IAmADunce = iAmADummy;
    }
}
  • 展示了一个名为ModuleA的类,它实现了IModule接口,并尝试注入一个名为IServiceIForgotToRegister的服务,但作者忘记注册这个服务。

1.7. 事件处理

  • 可以通过挂钩ModuleManagerLoadModuleCompleted事件来查看模块加载时发生的情况。
csharp 复制代码
protected override void InitializeModules()
{
    var manager = Container.Resolve<IModuleManager>();
    manager.LoadModuleCompleted += LoadModuleCompleted;
    manager.Run();
}

private void LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
{
    LoadModuleCompleted(e.ModuleInfo, e.Error, e.IsErrorHandled);
}

protected virtual void LoadModuleCompleted(IModuleInfo moduleInfo, Exception error, bool isHandled)
{
    if (error != null)
    {
        // Do Something
    }
}

1.8. 错误处理

  • 如果发生错误,可以通过ContainerResolutionExceptionGetErrors()方法来获取错误的详细信息,包括错误类型和错误消息。
csharp 复制代码
protected virtual void LoadModuleCompleted(IModuleInfo moduleInfo, Exception error, bool isHandled)
{
    if (error != null && error is ContainerResolutionException cre)
    {
        var errors = cre.GetErrors();
        foreach((var type, var ex) in errors)
        {
            Console.WriteLine($"Error with: {type.FullName}");
            Console.WriteLine($"{ex.GetType().Name}: {ex.Message}");
        }
    }
}

1.9. 运行结果

  • 当运行代码时,应该能看到类似于以下的输出,指出了具体的错误类型和消息,例如:"未在容器中找到指定类型的注册"。

    Error with: MyProject.Services.IServiceIForgotToRegister
    ContainerResolutionException: No Registration was found in the container for the specified type

相关链接

相关推荐
sayang_shao1 小时前
ARM架构运行模式学习笔记
arm开发·学习·架构
happymaker06263 小时前
web前端学习日记——DAY04
前端·学习
solicitous4 小时前
遇到一个口头机遇
学习·生活
观书喜夜长6 小时前
大模型应用开发学习-基于 LangChain 框架实现的交互式问答脚本
python·学习
FPGA小迷弟6 小时前
FPGA 时序约束基础:从时钟定义到输入输出延迟的完整设置
前端·学习·fpga开发·verilog·fpga
炽烈小老头7 小时前
【每天学习一点算法 2026/03/22】前 K 个高频元素
学习·算法
神舟之光8 小时前
Java面向对象编程知识补充学习-2026.3.21
java·开发语言·学习
网络工程小王8 小时前
【大数据技术详解】——Kibana(学习笔记)
大数据·笔记·学习
im_AMBER8 小时前
Leetcode 144 位1的个数 | 只出现一次的数字
学习·算法·leetcode
red_redemption8 小时前
自由学习记录(144)
学习