【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

相关链接

相关推荐
biter008831 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
Code哈哈笑2 小时前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
明耀2 小时前
WPF TabControl 设置item不能点击
wpf
QQ同步助手2 小时前
如何正确使用人工智能:开启智慧学习与创新之旅
人工智能·学习·百度
流浪的小新2 小时前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
军训猫猫头3 小时前
20.抽卡只有金,带保底(WPF) C#
ui·c#·wpf
A懿轩A3 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
明耀3 小时前
WPF 设置平均布局 如果隐藏的话,能够自动扩展
wpf
南宫生11 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__11 小时前
Web APIs学习 (操作DOM BOM)
学习