ASP.NET Core 与接口绑定嵌套配置

Krz*_*ous 6 c# asp.net-core

我有一些配置界面

public interface IAppConfig
{
    IFeatureConfiguration FeatureConfiguration { get; set; }
    IOtherConfiguration OtherConfiguration { get; set; }
}
public interface IFeatureConfiguration 
{
    string SettingFoo { get; set; }
}
public interface IOtherConfiguration 
{
    string SettingBar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和课程

public class AppConfig : IAppConfig
{
    public IFeatureConfiguration FeatureConfiguration { get; set; }
    public IOtherConfiguration OtherConfiguration { get; set; }
}
public class FeatureConfiguration : IFeatureConfiguration 
{
    public string SettingFoo { get; set; }
}
public class OtherConfiguration : IOtherConfiguration 
{
    public string SettingBar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想Startup.cs使用代码将 appsetting.json 绑定到类:

var appConfiguration = Configuration.GetSection("Configuration").Get<AppConfig>();
Run Code Online (Sandbox Code Playgroud)

我有一个例外: "Cannot create instance of type '[...].IFeatureConfiguration' because it is either abstract or an interface."

我知道我可以摆脱接口并仅使用类,但我真的想要它们......任何帮助将不胜感激

Ram*_*yev 0

我有同样的场景,我是这样做的:

例如appsettings.json如下所示:

{
  "Configuration": {
    "FeatureConfiguration ": {
      "SettingFoo": "Test setting foo"
    },
    "OtherConfiguration": {
      "SettingBar": "Test setting bar"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你有一些如下所示的界面:

public interface IAppConfig
{
    IFeatureConfiguration FeatureConfiguration { get; set; }
    IOtherConfiguration OtherConfiguration { get; set; }
}

public interface IFeatureConfiguration 
{
    string SettingFoo { get; set; }
}

public interface IOtherConfiguration 
{
    string SettingBar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您实现了这些接口,如下所示:

public class AppConfig : IAppConfig
{
    public IFeatureConfiguration FeatureConfiguration { get; set; }
    public IOtherConfiguration OtherConfiguration { get; set; }
}

public class FeatureConfiguration : IFeatureConfiguration 
{
    public string SettingFoo { get; set; }
}

public class OtherConfiguration : IOtherConfiguration 
{
    public string SettingBar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

首先,您必须使用具体的类对象初始化 appConfiguration

IAppConfig appConfiguration = new AppConfig {
   FeatureConfiguration = new FeatureConfiguration(),
   OtherConfiguration = new OtherConfiguration()
}
Run Code Online (Sandbox Code Playgroud)

您可以将嵌套配置绑定到该对象。您可以使用Bind如下方法来实现此目的:

Configuration.GetSection("Configuration").Bind(appConfiguration);
Run Code Online (Sandbox Code Playgroud)

总之appsettings.json绑定到appConfiguration对象。

您还可以看到这个答案:https ://stackoverflow.com/a/63170497/8810311