Prism Dependency Injection
1.处理解析错误
1.1. 处理解析错误:
- 这个特性是在Prism 8中引入的,如果你的应用目标是早期版本,则不适用。
1.2. 异常发生的原因:
- 开发者可能会遇到多种原因导致的异常,常见的错误包括未注册的服务或无效的XAML,这些在视图解析时会引发异常。
1.3. Prism容器扩展:
- Prism容器扩展现在会非常刻意地捕获任何底层容器异常,并抛出一个
ContainerResolutionException
。
1.4. ContainerResolutionException的目标:
- 通过提供你需要的信息来缩短开发循环,帮助你诊断和修复代码中的问题。
1.5. ContainerResolutionException包含的内容:
- 它包含一些常量消息,如
MissingRegistration
、CannotResolveAbstractType
或CyclicalDependency
。 - 除了这些常量,它还暴露了正在解析的服务名称(ServiceName)和服务类型(ServiceType)的属性。
1.6. 代码示例:
csharp
public class ModuleA : IModule
{
private IServiceIForgotToRegister IAmADunce { get; }
public ModuleA(IServiceIForgotToRegister iAmADummy)
{
IAmADunce = iAmADummy;
}
}
- 展示了一个名为
ModuleA
的类,它实现了IModule
接口,并尝试注入一个名为IServiceIForgotToRegister
的服务,但作者忘记注册这个服务。
1.7. 事件处理:
- 可以通过挂钩
ModuleManager
的LoadModuleCompleted
事件来查看模块加载时发生的情况。
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. 错误处理:
- 如果发生错误,可以通过
ContainerResolutionException
的GetErrors()
方法来获取错误的详细信息,包括错误类型和错误消息。
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
相关链接
- 介绍(Introduction)
- 命令(Commands)
- 依赖注入(Dependency Injection)