J4N*_*J4N 14 c# wpf dependency-injection prism unity-container
在WPF项目(带棱镜)中,我们使用UnityDI框架.
最近,在我们合并了两个大分支机构之后,我们无法启动我们的应用程序StackOverflowException.由于异常的性质,我们无法得到他的调用堆栈或当前值,我们只是因为命名空间而导致问题是来自Unity.
我们花了5个多小时才找到问题所在:
简化:
我们有3-4个服务(A,B,C和D),每个服务都有一个实现,并且在某些时候,服务A需要服务B,这需要服务C,这需要服务D ,这需要服务A).基本上是循环引用.
我们想知道是否有可能添加一些Unity尝试使用实现X解决服务A的日志,并且需要解析服务B,...
这将有助于我们调试此问题,直接查看哪些服务涉及此循环引用.
反正有没有实现这个目标?
参加聚会有点晚了,但是对于完全相同的问题,我创建了这个,并且工作正常:
internal class LogExtension : UnityContainerExtension
{
public LogExtension( ILogger logger )
{
_logger = logger;
}
#region UnityContainerExtension
protected override void Initialize()
{
Context.Strategies.Add( new LoggingStrategy( _logger ), UnityBuildStage.PreCreation );
}
#endregion
#region private
private readonly ILogger _logger;
private class LoggingStrategy : BuilderStrategy
{
public LoggingStrategy( ILogger logger )
{
_logger = logger;
}
#region BuilderStrategy
public override void PreBuildUp( IBuilderContext context )
{
_logger.Log( $"Resolving {context.BuildKey.Type} for {context.OriginalBuildKey.Type}" );
}
#endregion
#region private
private readonly ILogger _logger;
#endregion
}
#endregion
}
Run Code Online (Sandbox Code Playgroud)
在引导程序中的某个位置(ConfigureContainer最有可能):
Container.AddExtension( new LogExtension( _logger ) );
Run Code Online (Sandbox Code Playgroud)
小智 0
您可以配置程序集绑定日志查看器Fusion Log以帮助诊断有问题的 Unity 分辨率。
它随 Visual Studio 一起安装,您只需在 VS 命令提示符中键入“fuslogvw”即可启动。
否则,这可能有助于配置记录器:How do I enable assembly bin failurelogging (Fusion) in .NET?
| 归档时间: |
|
| 查看次数: |
1786 次 |
| 最近记录: |