【发布时间】:2019-04-08 12:03:52
【问题描述】:
我正在尝试在 Unity(版本 4)中注册通用 ILogger(来自 Microsoft.Extensions.Logging,而不是来自 Serilog)。
我有以下课程:
public class MyClass
{
private readonly Microsoft.Extensions.Logging.ILogger<MyClass> _logger;
public MyClass(Microsoft.Extensions.Logging.ILogger<MyClass> logger)
{
_logger = logger;
}
}
以及以下 Unity 注册和测试:
// Arrange
IUnityContainer container = new UnityContainer();
// provider from Serilog.Extensions.Logging nuget package
var provider = new Serilog.Extensions.Logging.SerilogLoggerProvider();
container.RegisterType(typeof(Microsoft.Extensions.Logging.ILogger<>),
new InjectionFactory((ctr, type, name) =>
{
var loggerType = type.GetGenericArguments()[0].FullName;
Microsoft.Extensions.Logging.ILogger logger = provider.CreateLogger(loggerType);
return logger;
}));
container.RegisterType<MyClass, MyClass>(); // just for demo purpose.
// Assert
container.Resolve<MyClass>();
这对我来说似乎没问题,太糟糕了,我在解决时遇到了以下错误:
例外情况是:InvalidCastException - 无法将“Serilog.Extensions.Logging.SerilogLogger”类型的对象转换为“Microsoft.Extensions.Logging.ILogger`1[MyNamespace.MyClass]”类型。
如何解决这个问题?
完全例外:
Microsoft.Practices.Unity.ResolutionFailedException:依赖项解析失败,类型 =“MyNamespace.MyClass”,名称 =“(无)”。 发生异常时:解析构造函数 MyNamespace.MyClass(Microsoft.Extensions.Logging.ILogger
1[[MyNamespace.MyClass, MyNamespace.Infra.UnitTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=edbaf8e9a324553f]] logger). Exception is: InvalidCastException - Unable to cast object of type 'Serilog.Extensions.Logging.SerilogLogger' to type 'Microsoft.Extensions.Logging.ILogger1[MyNamespace.MyClass]' 的参数“logger”。
更新
使用 Microsoft.Extensions.DependencyInjection 时,此方法有效:
// Arrange
var serviceCollection = new Microsoft.Extensions.DependencyInjection.ServiceCollection()
.AddLogging(builder => builder.AddSerilog())
.AddTransient<MyClass, MyClass>();
var serviceProvider = serviceCollection.BuildServiceProvider();
// Assert
serviceProvider.GetService<MyClass>();
所以我尝试使用 Unity 而不是 Microsoft.Extensions.DependencyInjection 来实现此功能
不幸的是,Unity 没有 AddSerilog,我必须使用 Unity
【问题讨论】:
-
container.RegisterType<MyClass, MyClass>();不应该类似于 container.RegisterType(); 吗?依赖注入通常是请求一个接口,而不是一个类。 -
container.RegisterType<MyClass, MyClass>()用于演示,问题是ILogger<MyClass>解决方案。 -
您是否尝试使用
interface注册到class?解决可能有问题,因为它没有接口.. -
尝试使用
private readonly Microsoft.Extensions.Logging.ILogger _logger;和public MyClass(Microsoft.Extensions.Logging.ILogger logger)。您正在注入配置中创建一个非专业记录器,因此当然不能分配给专门的记录器。 -
@kara 是的,接口也存在同样的问题(例如 IMyClass)
标签: c# unity-container serilog .net-core-logging