Open
Description
How to reproduce
Use standard ASP.NET Core application (I'm tried on netcoreapp2.1
, netcoreapp2.2
and netcoreapp3.0
)
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Unity;
using Unity.Microsoft.DependencyInjection;
namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUnityServiceProvider(new UnityContainer()
.AddExtension(new Diagnostic()) // <---- without this line everything is ok
)
.UseStartup<Startup>();
}
}
The following exception throws:
System.InvalidOperationException: No service for type 'Microsoft.Extensions.Logging.ILogger`1[Microsoft.AspNetCore.Hosting.Internal.WebHost]' has been registered.
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at WebApplication1.Program.Main(String[] args)
The real under hood exception from Unity.Microsoft.DependencyInjection.ServiceProvider
is
Unity.ResolutionFailedException: Ambiguous constructor: Failed to choose between LoggerFactory(System.Collections.Generic.IEnumerable`1[Microsoft.Extensions.Logging.ILoggerProvider], Microsoft.Extensions.Options.IOptionsMonitor`1[Microsoft.Extensions.Logging.LoggerFilterOptions]) and LoggerFactory(System.Collections.Generic.IEnumerable`1[Microsoft.Extensions.Logging.ILoggerProvider], Microsoft.Extensions.Logging.LoggerFilterOptions)
_____________________________________________________
Exception occurred while:
•resolving type: 'ILoggerFactory' mapped to 'LoggerFactory'
for parameter: 'factory'
on constructor: Logger`1(ILoggerFactory factory)
•resolving type: 'ILogger`1' mapped to 'Logger`1'
If remove Diagnostic
extension from the container then everything works fine.