How to debug Unity resolution? How to debug Unity resolution? wpf wpf

How to debug Unity resolution?


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 ) );


If You are using Unity v5+ and are too lazy to look up what changed from v4 to v5, then you can copy my version:

using System.Reflection;using Unity.Extension;using Unity.Builder;using Unity.Strategies;namespace Company.ProjectName.Shared.Bootstrap.Unity{    public class LogResolvesUnityContainerExtension : UnityContainerExtension    {        private static readonly ILogger Logger = LoggerManager.CreateLogger(MethodBase.GetCurrentMethod().DeclaringType);                protected override void Initialize()        {            Context.Strategies.Add(new LoggingStrategy(Logger), UnityBuildStage.PreCreation);        }        private class LoggingStrategy : BuilderStrategy        {            private readonly ILogger _logger;                        public LoggingStrategy(ILogger logger)            {                _logger = logger;            }            public override void PreBuildUp(ref BuilderContext context)            {                // Be aware that for Singleton Resolving this log message will only be logged once, when the Singleton is first resolved. After that, there is no buildup and it is just returned from a cache.                                var registrationType = context.RegistrationType;                 var registrationName = context.Name;                var resolvedType = context.Type;                                var registrationNameWithParenthesesOrNothing = string.IsNullOrEmpty(registrationName) ? "" : $"({registrationName})";                _logger.LogDebug($"Resolving [{registrationType}{registrationNameWithParenthesesOrNothing}] => [{resolvedType}]");            }        }    }}

Credit still goes to Haukinger for writing the v4 original version.


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?