Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从类库访问Asp.net-core中的appsetting.json_C#_Asp.net Core_.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 从类库访问Asp.net-core中的appsetting.json

C# 从类库访问Asp.net-core中的appsetting.json,c#,asp.net-core,.net-core,asp.net-core-mvc,C#,Asp.net Core,.net Core,Asp.net Core Mvc,我正试图从类库中访问appsetting.json文件。到目前为止,我找到的解决方案是从Microsoft.Extensions.configuration创建一个实现接口IConfiguration的配置类,并将json文件添加到类中并从中读取 var configuration = new Configuration(); configuration.AddJsonFile("appsetting.json"); var connectionString= configuration.Get

我正试图从类库中访问
appsetting.json
文件。到目前为止,我找到的解决方案是从
Microsoft.Extensions.configuration
创建一个实现接口
IConfiguration
的配置类,并将json文件添加到类中并从中读取

var configuration = new Configuration();
configuration.AddJsonFile("appsetting.json");
var connectionString= configuration.Get("connectionString");

这似乎是一个糟糕的选择,因为每次访问appsetting配置时都必须添加json文件。我们在ASP.NET

中没有类似
ConfigurationManager
的选项吗?我假设您想从web应用程序访问
appsettings.json
文件,因为默认情况下类库没有
appsettings.json

我创建了一个模型类,它的属性与
appsettings.json
中的一节中的设置相匹配

appsettings.json中的部分

"ApplicationSettings": {
    "SmtpHost": "mydomain.smtp.com",
    "EmailRecipients": "me@mydomain.com;other@mydomain.com"
}   
匹配模型类

namespace MyApp.Models
{
    public class AppSettingsModel
    {
        public string SmtpHost { get; set; }
        public string EmailRecipients { get; set; }
    }
}
然后填充该模型类并将其添加到DI容器中的
IOptions
集合中(这在启动类的
Configure()
方法中完成)

services.Configure(Configuration.GetSection(“应用程序设置”);
//其他配置资料
services.AddOptions();
然后,您可以通过将该类作为参数添加到构造函数中,从框架调用的任何方法访问该类。框架负责查找类并将其提供给构造函数

public class MyController: Controller
{
    private IOptions<AppSettingsModel> settings;

    public MyController(IOptions<AppSettingsModel> settings)
    {
        this.settings = settings;
    }
}
公共类MyController:Controller
{
私人设置;
公共MyController(IOPS设置)
{
this.settings=设置;
}
}

然后,当类库中的某个方法需要设置时,我要么单独传递设置,要么传递整个对象。

我知道答案已经被接受,但这个问题是Google上最热门的问题,OPs问题是关于类库的,而不是ASP.NET Web App或WebApi,这是被接受的答案所使用的


在我看来,类库不应该使用应用程序设置,并且应该不受这些设置的影响。如果您需要类库中的应用程序设置,则应该从使用者处提供这些设置。您可以看到这方面的一个示例

我知道这个问题有一个公认的答案,但这个问题是关于类库的,从类库读取appsettings.json的方法如下:

创建具有与设置文件中的属性相匹配的属性的模型:

public class ConfigurationManager
{
    public string BaseUrl { get; set; }
}
在appsettings.json中添加实际设置

  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }
现在,在startup.cs中向您的模型注册appsettings.json部分:

 services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));
并获取您的配置设置:

using Microsoft.Extensions.Options;


public class KeyUrls: IKeyUrls
{
    public string BaseUrl = "";
    private readonly IOptions<ConfigurationManager> _configurationService;

    public KeyUrls(IOptions<ConfigurationManager> configurationservice)
    {
        _configurationService = configurationservice;
        BaseUrl = _configurationService.Value.BaseUrl;
    }

    public  string GetAllKeyTypes()
    {
        return $"{BaseUrl}/something";
    }

    public  string GetFilteredKeys()
    {
        return $"{BaseUrl}/something2";
    }
}
使用Microsoft.Extensions.Options;
公共类KeyUrls:IKeyUrls
{
公共字符串BaseUrl=“”;
专用只读IOptions\u配置服务;
公钥URL(IOPS配置服务)
{
_configurationService=configurationService;
BaseUrl=\u configurationService.Value.BaseUrl;
}
公共字符串GetAllKeyTypes()
{
返回$“{BaseUrl}/something”;
}
公共字符串GetFilteredKeys()
{
返回$“{BaseUrl}/something2”;
}
}

有关更多详细信息,请检查

除了这些问题有公认的答案外,我相信没有人只适用于没有启动项目或与Asp.NetCore stack或IServiceCollection没有依赖关系的类库

这就是我从类库读取配置的方法:

using Microsoft.Extensions.Configuration;
using System.IO;

public class ConfigSample
{
    public ConfigSample
    {
            IConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"));

            var root = builder.Build();
            var sampleConnectionString = root.GetConnectionString("your-connection-string");
    }
}
需要以下nuget软件包:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.FileProviders.Abstractions
  • Json
  • Microsoft.Extensions.Configuration.Json

    • 在类构造函数DI中工作。 Microsoft文档很容易做到这一点

      string c = Directory.GetCurrentDirectory();
      IConfigurationRoot configuration = 
      newConfigurationBuilder().SetBasePath(c).AddJsonFile("appsettings.json").Build();
      string connectionStringIs = configuration.GetConnectionString("MyConnection"); 
      
      从最后一行可以得到连接字符串

      如果要配置上下文,请编写以下额外代码:

      optionsBuilder.UseSqlServer(connectionStringIs); //inside protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      
      不要忘记安装和使用以下软件包:-

      using Microsoft.Extensions.Configuration; 
      using Microsoft.Extensions.Configuration.FileExtensions; 
      using Newtonsoft.Json; 
      using Microsoft.Extensions.Configuration.Json; 
      using System.IO;
      

      我部分同意;对于在dotnet核心解决方案中设置为类库的测试项目,使用或嵌入appsettings是完全可以接受的。在这种情况下,测试项目(例如类库)当然是使用者。@Moriarty True,但在某些情况下,您可能还拥有多个环境,可以在其中执行测试套件。在这种情况下,嵌入式设置将不起作用(例如,您有集成测试,需要知道与API对话的环境)。我不认为这在某种程度上总是正确的,而且总是逐案的。当然,类库应该使用指向本地db实例的连接字符串。而CI系统会覆盖该设置以使用另一个实例。我认为这个答案还没有解决办法。这不是关于asp.net核心,而是关于.net核心读取应用程序设置@斯蒂芬波特:我不同意。在一个高度划分的生态系统中,每个DLL都可能利用可配置的功能,主要消费者不知道层中发生了什么。例如,可以将成像组件配置为利用不同的成像提供者。谢天谢地,微软将
      System.Configuration
      引入了核心,它支持
      app.config
      文件。对于那些将项目从框架迁移到Core的人来说,这尤其重要。他们不确定,自从这被接受为答案以来,是否发生了一些变化,但当我两天前开始一个新项目时,这对我来说并不起作用。我为使其正常工作所做的更改是:而不是IOOptions设置;,我不得不将其更改为AppSettingsModelSettings;然后在控制器构造函数中,我更改了此行this.settings=settings;设置为this.settings=settings.Value;然后它开始工作。上面的答案在services.Configure()调用之后的启动中忘记了以下代码行:
      services.AddOptions()
      
      optionsBuilder.UseSqlServer(connectionStringIs); //inside protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      
      using Microsoft.Extensions.Configuration; 
      using Microsoft.Extensions.Configuration.FileExtensions; 
      using Newtonsoft.Json; 
      using Microsoft.Extensions.Configuration.Json; 
      using System.IO;