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. 代码示例 :
public class ModuleA : IModule
{
private IServiceIForgotToRegister IAmADunce { get ; }
public ModuleA ( IServiceIForgotToRegister iAmADummy)
{
IAmADunce = iAmADummy;
}
}
展示了一个名为ModuleA
的类,它实现了IModule
接口,并尝试注入一个名为IServiceIForgotToRegister
的服务,但作者忘记注册这个服务。
1.7. 事件处理 :
可以通过挂钩ModuleManager
的LoadModuleCompleted
事件来查看模块加载时发生的情况。
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 )
{
}
}
1.8. 错误处理 :
如果发生错误,可以通过ContainerResolutionException
的GetErrors()
方法来获取错误的详细信息,包括错误类型和错误消息。
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
相关链接