2016-07-15 63 views
12

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

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

这似乎是一个不坏的选择,因为我们要添加JSON每次我们需要访问appsetting配置文件的时间。我们有没有其他的替代方法,如在ASP.NET

+0

[在C#类库中使用IConfiguration]的可能重复(https://stackoverflow.com/questions/27880433/using-iconfiguration-in-c-sharp-class-library) –

+0

[使用C#类库中的IConfiguration](https://stackoverflow.com/q/27880433/1647238),请参阅[我的回答](https://stackoverflow.com/a/47645131/1647238) –

回答

13

我假设你想从web应用程序访问appsettings.json文件,因为默认情况下类库没有appsettings.json

我创建了一个模型类,其属性与appsettings.json中的某个部分中的设置相匹配。

在appsettings.json节

"ApplicationSettings": { 
    "SmtpHost": "mydomain.smtp.com", 
    "EmailRecipients": "[email protected];[email protected]" 
} 

匹配模型类

namespace MyApp.Models 
{ 
    public class AppSettingsModel 
    { 
     public string SmtpHost { get; set; } 
     public string EmailRecipients { get; set; } 
    } 
} 

然后填充该模型类,它在DI容器添加到收藏IOptions(这样做在Startup类的Configure()方法中)。

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings")); 

// Other configuration stuff 

services.AddOptions(); 

然后你可以从该框架通过将其作为构造函数的参数调用任何方法访问类。该框架处理查找并将该类提供给构造函数。

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

    public MyController(IOptions<AppSettingsModel> settings) 
    { 
     this.settings = settings; 
    } 
} 

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

+0

不知道自从这被接受为答案之后是否有什么变化,但是当我两天前开始一个新项目时,它并不适用于我。 我为了使它工作所做的更改是: 而不是IOptions settings ;,我必须将其更改为AppSettingsModel设置; 然后在控制器构造函数中,我改变了这一行this.settings = settings; to this.settings = settings.Value; 然后它开始工作。 – Syed

+0

上面的答案忘记了在服务启动后的以下代码行。配置<>()调用: 'services.AddOptions();' –

+0

@StephenPorter在您的答案中添加您的行感觉很舒服。 – gtzinos

20

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

IMO,类库不应该使用应用程序设置,应该不可知这些设置。如果您需要在您的课程库中使用应用程序设置,那么您应该提供消费者的设置。你可以看到一个这样的例子:On This SO Question

+3

我部分同意;对于在dotnet核心解决方案中设置为类库的**测试项目**,使用或嵌入appsettings是完全可以接受的。在这种情况下,测试项目例如班级图书馆当然是消费者。 –

+0

@Moriarty确实如此,但在某些情况下,您可能还有多个可能会执行测试套件的环境。在这种情况下,嵌入式设置不起作用(例如,您有集成测试,需要知道与API对话的环境)。我不认为这种或那种方式总是真实的,而且总是一个一个的情况。 –

+0

当然,类库应该使用指向本地数据库实例的连接字符串。而该设置被CI系统覆盖以使用另一个实例。恕我直言,这个答案还没有解决。它不是关于asp.net核心关于.NET CORE阅读appsettings! – Pascal