【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

相关链接

相关推荐
令狐前生16 分钟前
设计模式学习整理
学习·设计模式
湘-枫叶情缘1 小时前
解构认知边界:论万能方法的本体论批判与方法论重构——基于跨学科视阈的哲学-科学辩证
科技·学习·重构·生活·学习方法
inputA2 小时前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
海尔辛2 小时前
学习黑客5 分钟读懂Linux Permissions 101
linux·学习·安全
真的想上岸啊4 小时前
学习51单片机01(安装开发环境)
嵌入式硬件·学习·51单片机
每次的天空4 小时前
Android学习总结之Glide自定义三级缓存(面试篇)
android·学习·glide
名誉寒冰5 小时前
# KVstorageBaseRaft-cpp 项目 RPC 模块源码学习
qt·学习·rpc
开发游戏的老王5 小时前
[虚幻官方教程学习笔记]深入理解实时渲染(An In-Depth Look at Real-Time Rendering)
笔记·学习·虚幻
码农小嘉6 小时前
若依框架页面
学习
小新1107 小时前
微信小程序学习之轮播图swiper
学习·微信小程序·notepad++