【发布时间】:2022-01-24 07:38:21
【问题描述】:
我正在设计一个基本的记录器,只是为了教育目的我在下面这样设计了配置界面
public interface ILoggerConfiguration
{
string LoggingPattern { get; set; }
IFileLoggerConfiguration FileLogger { get; set; }
}
public interface IFileLoggerConfiguration
{
string FileName { get; set; }
string DirectoryName { get; set; }
string FileExtension { get; set; }
}
public class LoggerConfiguration : ILoggerConfiguration
{
string LoggingPattern { get; set; }
IFileLoggerConfiguration FileLogger { get; set; }
}
public class FileLoggerConfiguration : IFileLoggerConfiguration
{
string FileName { get; set; }
string DirectoryName { get; set; }
string FileExtension { get; set; }
}
这些都存在于我创建的记录器库(这是一个类库)和我尝试如下调用的 ASP.net 核心项目中。
services.AddSingleton<ILoggerConfiguration, LoggerConfiguration>(_ =>
Configuration
.GetSection(nameof(LoggerConfiguration))
.Get<LoggerConfiguration>());
我试图通过依赖注入来实例化它,然后我收到如下错误消息。
System.InvalidOperationException: '无法创建类型的实例 'Logger.IFileLoggerConfiguration' 因为它要么是抽象的,要么是 界面。'
我知道我在这里尝试实例化接口是错误的。我找不到摆脱这种情况的方法。有人建议如何在从 appsettings.json 获取时将 IFileLoggerConfiguration 注入 ILoggerConfiguration 中?
appsettings.json 的值如下
"LoggerConfiguration": {
"LoggingPattern": "Message|Date|LogLevel",
"FileLogger": {
"FileName": "Test it",
"DirectoryName": "D:\\Logger",
"FileExtension": ".log"
}
}
【问题讨论】:
-
信息很清楚。当配置类只有一个接口时,它们无法猜测要创建什么类型的对象。你为什么使用接口而不是类?当属性是接口时 - 它应该实例化哪个类?可能有无数个类实现了这个特定的接口。
-
@SebastianSiemens 是的,你是对的。我知道并且我可以更改相同的类结构,但我正在寻找是否有人有更好的解决方案,而且我是 ASP .Net 核心功能的新手
标签: c# asp.net-core configuration