【问题标题】:Configuration Interface inside an interface in appsettings.jsonappsettings.json 中接口内的配置接口
【发布时间】: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


【解决方案1】:

这是不可能的,你确实需要改变类结构(只使用类,不使用接口)或者自己用嵌套对象构造对象。

可以在此处找到类似的问题 + 答案:Options pattern - Interface/Abstract property

【讨论】:

  • 您提供的链接非常有用。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-11-06
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多