Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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# 从Core 2.0中的类库访问appsettings.json中的设置_C#_Json_Asp.net Core 2.0_Appsettings - Fatal编程技术网

C# 从Core 2.0中的类库访问appsettings.json中的设置

C# 从Core 2.0中的类库访问appsettings.json中的设置,c#,json,asp.net-core-2.0,appsettings,C#,Json,Asp.net Core 2.0,Appsettings,我在这里读了十几个问题,至少有4篇博文,但我无法在VS2017解决方案中使用多个类库项目。然而,我可以让它与一个web应用程序和一个类库的解决方案一起工作,尽管使用的模式与我在文档中找到的模式不同,等等 public class SomeClass { public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp

我在这里读了十几个问题,至少有4篇博文,但我无法在VS2017解决方案中使用多个类库项目。然而,我可以让它与一个web应用程序和一个类库的解决方案一起工作,尽管使用的模式与我在文档中找到的模式不同,等等

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
我的解决方案包含5个项目:Web应用程序、测试、基础设施、服务、域(后三个是类库)

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
在基础设施项目中,我创建了一个名为EmailConfigurationSettings的类,并将其注册到WebApp的StartUp类中

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
此类位于类库中:

public class EmailConfigurationSettings
{
    public string Provider { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
这在WebApp的StartUp.cs中:

services.Configure<EmailConfigurationSettings>(Configuration.GetSection("EmailConfigurationSettings"));
services.AddOptions();
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
我需要服务项目中的设置。但现在我只是想确保我能真正找回它们。下面的代码遵循我找到的所有代码示例,但生成:

public class LoadEmailSettingsFromAppSettings
{
    private readonly IOptions<EmailConfigurationSettings> _emailSettings;

    public LoadEmailSettingsFromAppSettings(IOptions<EmailConfigurationSettings> emailSettings)
    {
        _emailSettings = emailSettings;
        Message = "Our provider is " + _emailSettings.Value.Provider;
    }

    public string Message { get; set; }
}
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
公共类加载EmailSettingsFromAppSettings
{
专用只读IOPS\u电子邮件设置;
公共加载电子邮件设置RomappSettings(IOOptions电子邮件设置)
{
_emailSettings=emailSettings;
Message=“我们的提供商是”+\u emailSettings.Value.provider;
}
公共字符串消息{get;set;}
}
_emailSettings始终为空

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
所以我试着在TestProject中测试它:

IOptions<EmailConfigurationSettings> someOptions = Options.Create<EmailConfigurationSettings>(new EmailConfigurationSettings());
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
IOptions someOptions=Options.Create(新建EmailConfigurationSettings());
嗯,那也是空的

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
在另一个解决方案中,使用WebApp和一个类库的解决方案, 使用我在其中一个博客上发现的稍微不同的模式,我实际上可以从appsettings.json检索值:

public class AuthMessageSender : IEmailSender, ISmsSender
{
    public AuthMessageSender(IOptions<EmailConfig> emailSettings)
    {
        _emailSettings = emailSettings.Value;
    }

    public EmailConfig _emailSettings { get; }

    public Task SendEmailAsync(string email, string subject, string message)
    {
        Execute(email, subject, message).Wait();
        return Task.FromResult(0);
    }
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
公共类AuthMessageSender:IEmailSender,ISmsSender
{
公共AuthMessageSender(IOptions emailSettings)
{
_emailSettings=emailSettings.Value;
}
公共EmailConfig_emailSettings{get;}
公共任务SendEmailAsync(字符串电子邮件、字符串主题、字符串消息)
{
执行(电子邮件、主题、消息)。等待();
返回Task.FromResult(0);
}

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
请注意,IOptions类与9个属性不同,但构造方式与上面的模式相同

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
但是使用这种模式在多类库项目中不起作用。我如何理解如何在多类库场景中使用这种模式

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}

我不知道为什么他们放弃了ConfigurationManager,这要容易得多。

在微服务中,您可以简单地绑定到与json定义匹配的新对象。您也可以这样做

var emailConfig = new EmailConfigurationSettings();
Configuration.GetSection("EmailConfigurationSettings").Bind(emailConfig);
services.AddSingleton(emailConfig);
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
一旦你这样做了,你所要做的就是在你的服务层构造函数中请求一份EmailConfigurationSettings的副本。这将给你该对象的依赖注入单例

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}

我会在“绑定”上设置一个断点,并确保填充了电子邮件配置。

这里有一个关于类库的有趣答案:

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
在代码的这一部分中:

private readonly IOptions<EmailConfigurationSettings> _emailSettings;

public LoadEmailSettingsFromAppSettings(IOptions<EmailConfigurationSettings> emailSettings)
{
    _emailSettings = emailSettings;         
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
private readonly IOptions\u emailSettings;
公共加载电子邮件设置RomappSettings(IOOptions电子邮件设置)
{
_emailSettings=emailSettings;
依赖项注入不起作用,因为您在类库中,所以应该保持这种方式

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
在Web应用程序的某个地方,您可以构建LoadEmailSettingsFromAppSettings

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
公共类SomeClass
{
public SomeClass(IOptions emailSettings)//依赖项注入在您的webapp中工作
{
var loadEmail=new LoadEmailSettingsFromAppSettings(emailSettings);//将emailSettings发送到类库中的其他类
//(...)
}
}
而私有只读应为:

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}
public IOptions<EmailConfigurationSettings> EmailSettings {get; private set;}
public-IOptions-EmailSettings{get;private-set;}

public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}

我希望运行项目a在AddSingleton调用(在StartUp.cs中)上设置一个断点是清楚和有帮助的产生一个空的emailConfig。所以这不起作用,与OP方法一样。如果这产生一个空的结果,那么他没有正确加载他的应用程序配置。这段代码取自我的个人mvc应用程序,所以我知道它可以工作。如果你将一个变量设置为getsection的返回值,我会认为它返回空
public class SomeClass
{
    public SomeClass(IOptions<EmailConfigurationSettings> emailSettings) // dependency injection works in your webapp
    {
        var loadEmail = new LoadEmailSettingsFromAppSettings(emailSettings); // send EmailSettings to your other class in your class library

        //(...)
    }
}