如何调试Unity分辨率?

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,...

这将有助于我们调试此问题,直接查看哪些服务涉及此循环引用.

反正有没有实现这个目标?

Hau*_*ger 5

参加聚会有点晚了,但是对于完全相同的问题,我创建了这个,并且工作正常:

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?