How to debug Unity resolution?

[亡魂溺海] 提交于 2020-03-18 10:36:32

问题


In a WPF project(with prism) we are using Unity as DI framework.

Recently, after we merged two big branches, we were not able to start our application, we were having StackOverflowException. Due to the nature of the exception, we were not able to get his call stack or current values, we were only seing that the issue was comming from Unity due to the namespace.

We spent more than 5 hours to find were the issue was occuring:

Simplified:

We were having 3-4 services(A, B, C and D), each one with an implementation, and at some point, the service A was requiring the service B, which was requiring the service C, which was requiring the service D, which was requiring the service A). Basically a cyclic reference.

We would like to know if there is any possibility to add some logs that Unity is trying to solve Service A with the implementation X, and was requiring to resolve service B, ...

This would have helped us a lot to debug this issue, to directly see which services were implicated in this cyclic reference.

Is there anyway to achieve this?


回答1:


A bit late to the party, but for the exact same problem, I created this and it's working just fine:

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
}

And somewhere in the the bootstrapper (ConfigureContainer most likely):

Container.AddExtension( new LogExtension( _logger ) );



回答2:


You can configure the Assembly binding log viewer Fusion Log to help diagnose problematic Unity resolutions.

It's installed with Visual Studio and you can just type "fuslogvw" into the VS command prompt to launch.

Otherwise, this may help with configuring the logger: How do I enable assembly bind failure logging (Fusion) in .NET?



来源:https://stackoverflow.com/questions/36332287/how-to-debug-unity-resolution

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!