【问题标题】:How to access appsettings from another project如何从另一个项目访问 appsettings
【发布时间】:2018-02-23 13:25:27
【问题描述】:

在启动文件中,我需要一种方法来访问另一个项目中的 IConfiguration。我被告知业务逻辑不应该知道 IConfiguration。如果是这样的话,那么我如何将数据从 appsettings 注入到业务逻辑项目中。

appsettings.json

{
  "AdminEmail": "myemail@gmail.com"
}

如何访问我在同一解决方案中创建的类库中的 AdminEmail?

【问题讨论】:

  • Appsettings 只是一个文件,而不是像 app.config 或 web.config 这样的特殊文件。如果有东西想使用 .NET Core 的配置服务,它必须使用IConfiguration 来指定哪些部分应该重新合成到哪些对象中。如果要使用 DI 填充配置设置,则需要将它们包装到 IOption 中。另一方面,如果您只是将设置作为普通的旧对象注入,则只有主项目需要处理 IConfiguration
  • @RyanWilson 这实际上是一种滥用控制器不应该关心IConfiguration,它应该只关心自己的设置类,例如EmailSettings。如果您只想传递 EmailSettings 类,为什么要模拟或启动整个中间件?

标签: c# asp.net-core


【解决方案1】:
  • 定义设置模型

    public sealed class EmailSettings
    {
        public string AdminEmail { get; set; }
    }
    
  • 配置设置

    public sealed class Startup
    {
        private readonly IConfiguration configuration;
    
        public Startup(IConfiguration configuration) => this.configuration = configuration;
    
        public void ConfigureServices(IServiceCollection services)
        {
            services
                .Configure<EmailSettings>(configuration)
                .AddSingleton(sp => sp.GetRequiredService<IOptions<EmailSettings>>().Value);
        }
    }
    
  • 注入并使用它

    public class ClassLibraryInTheSameSolution
    {
        public ClassLibraryInTheSameSolution(EmailSettings emailSettings)
        {                         
        }
    }
    

【讨论】:

  • EmailSettings 是在哪个项目中定义的?包含 appsettings.json 或类库的“顶级”项目?如果它是在“顶级”项目中定义的,那么你不能像以前那样注入它,因为类库不知道 EmailSettings 的类型。
  • @MarioMucalo 类库应该知道EmailSettings 类型,因为该类型在构造函数public ClassLibraryInTheSameSolution(EmailSettings emailSettings) 中使用。只需在类库项目或其他单独项目(例如 Infrastructure.Settings)中定义类 EmailSettings
  • 我同意...但是,这是真正的脱钩吗? :)
  • 问这个问题可能为时已晚,但我认为我有与上述类似的情况。假设您的 ClassLibraryInTheSameSolution 类在另一个项目中,而您的 services.Configure 代码在另一个项目中。记住两个项目都知道 EmailSettings 如何调用类中定义的方法?如果使用 ClassLibraryInTheSameSolution obj= new ClassLibraryInTheSameSolution ();是你在构造中获得配置值的那个。由于所有明显的原因,我正面临编译时错误。
  • @AdityaPewekar 定义带参数的构造函数 ClassLibraryInTheSameSolution(EmailSettings emailSettings) { } 隐藏了不带参数的默认构造函数。这就是您尝试使用它时出错的原因。
【解决方案2】:

您可以使用Microsoft.Extensions.Configuration 来实现此目的。 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?tabs=basicconfiguration

1 - 为设置创建模型

public class AppSettings 
{
    public string AdminEmail { get; set; }
}

2 - 在 Startup.cs 上配置它

services.Configure<AppSettings>(Configuration);

3 - 在您的类库中使用 DI 来检索设置

private readonly AppSettings _appSettings;

public MyClass(IOptions<AppSettings> appSettings)
{
    _appSettings = appSettings.Value;
}

【讨论】:

    【解决方案3】:

    你可以很容易地注入它:

    public class EmailSettings
    {
        public string AdminEmail { get; set; } // encapsulate as needed
    }
    
    public void ConfigureServices(IServiceCollection services)
    {
        var settings = new EmailSettings
        {
            AdminEmail = Configuration["AdminEmail"]
        };
    
        services.AddSingleton(settings);
    }
    
    public class WhereverYouNeedThis
    {
        private readonly EmailSettings _emailSettings;
    
        public WhereverYouNeedThis(EmailSettings emailSettings)
        {
            _emailSettings = emailSettings;
        }
    
        public void Use()
        {
            Debug.Log(_emailSettings.AdminEmail);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2023-03-06
      • 2013-03-28
      • 2022-12-28
      • 2020-04-27
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多