Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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# 初始化存在IOptions注入问题的类_C#_Asp.net Core_Dependency Injection_.net Core - Fatal编程技术网

C# 初始化存在IOptions注入问题的类

C# 初始化存在IOptions注入问题的类,c#,asp.net-core,dependency-injection,.net-core,C#,Asp.net Core,Dependency Injection,.net Core,我刚开始用NetCore2.1构建一个API 我在appsettings.json中添加了连接字符串,我想访问它 appsettings.json "MySettings": { "connectionString": "Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=Subscription;Data Source=Test-Pc", "Email": "abc@domain.com",

我刚开始用NetCore2.1构建一个API

我在appsettings.json中添加了连接字符串,我想访问它

appsettings.json

  "MySettings": {
    "connectionString": "Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=Subscription;Data Source=Test-Pc",
    "Email": "abc@domain.com",
    "SMTPPort": "5605"
  }
首先,我在startup.cs中添加了配置管理器,以便可以插入其他类

startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.Configure<MyConfig>(Configuration.GetSection("appsettings"));
        }
    public class CustomSqlConnection : IDisposable
    {
        private SqlConnection sqlConn;
        private readonly IOptions<MyConfig> _myConfig;

        public CustomSqlConnection(IOptions<MyConfig> _Config = null)
        {
            _myConfig = _Config;

            string connectionString = _myConfig.Value.connectionString;

            if (string.IsNullOrEmpty(connectionString))
            {
                throw new Exception(string.Format("Connection string was not found in config file"));
            }

            this.sqlConn = new SqlConnection(connectionString);
        }

      }
但是,
IOptions\u Config
显示为空


初始化注入IOptions或任何其他接口的类的最佳实践是什么。

可能首先从json获取设置,以便查看其是否正常工作,然后进行配置

var config = configuration.GetSection("MySettings").Get<MyConfig>();
var config=configuration.GetSection(“MySettings”).Get();
然后,如果这样做正确:

services.Configure<MyConfig>(opts => 
{
    // map the properties here
    // opts.Property1 = config.Property1;
}
services.Configure(选项=>
{
//在这里映射属性
//opts.Property1=config.Property1;
}
此外,请确保已安装以下NuGet软件包:

Microsoft.Extensions.Configuration.Binder, Microsoft.Extensions.Configuration.Json,
Microsoft.Extensions.DependencyInjection

您可以在正在初始化的类中使用依赖项注入
CustomSqlConnection
对象

public class YourNewClass : IYourNewClass
{    
    private CustomSqlConnection _connection { get; set; }
    //inject IOption here
    public YourNewClass(IOptions<MyConfig> _config)
    {
       _connection = new CustomSqlConnection(_config); //use this instance for all the repository methods
    }
}
在startup.cs中,请在mvc之前配置应用程序设置

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {
        Configuration = configuration;
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.Development.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();

    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        //do all needed service registrations
        services.Configure<SpotMyCourtConfiguration>(Configuration);           
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //do all needed functionalities
        app.UseMvc();
    }
}
公共类启动
{
公共启动(IConfiguration配置,IHostingEnvironment环境)
{
配置=配置;
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
.AddJsonFile($“appsettings.Development.json”,可选:true)
.AddenEnvironmentVariables();
Configuration=builder.Build();
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
//完成所有需要的服务注册
服务。配置(配置);
services.AddMvc();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
//完成所有需要的功能
app.UseMvc();
}
}

Configuration.GetSection(“MySettings”)将尝试在appsettings.json文件中查找“MySettings”部分

MySettings
类应该如下所示

public class MySettings
{
    public string connectionString { get; set; }
    public string Email { get; set; }
    public string SMTPPort { get; set; }
}
然后在启动时,您将能够为
MySettings

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<MyConfig>(Configuration.GetSection("MySettings"));
}
public void配置服务(IServiceCollection服务)
{
services.AddMvc();
services.Configure(Configuration.GetSection(“MySettings”);
}
设置和使用

public class SomeClass
{
    private readonly MySettings _settings;

    public SomeClass(IOptions<MySettings> setitngs)
    {
        _settings = setitngs.Value // notice of using a .Value property
    }
}
公共类SomeClass
{
私人只读MySettings\u设置;
公共类(IOOptions设置)
{
_settings=setitngs.Value//使用.Value属性的注意事项
}
}

Maybe
Configuration.GetSection(“MySettings”)
只需要一些澄清。您的
MyConfig
类与'appsettings.json'相同,对吗?是的,它是相同的。顺便说一句,找不到Configuration.GetSection。问题的可能重复之处是,如果我必须初始化YourNewClass,我必须再次执行相同的过程。在编辑的答案中,您可以看到如何使用
YourNewClass
@MissakBoyajianconfiguration.GetSection不工作,我注入了所有这些包。也许我刚刚注意到cz它是2.1?检查appsettings.json的属性。也许它没有复制到构建目录。但是如何初始化SomeClass?比如new SomeClass()“?@MissakBoyajian,依赖注入的想法,你不需要。你需要注册类,并将其作为将使用它的类的构造函数参数引入。
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<MyConfig>(Configuration.GetSection("MySettings"));
}
public class SomeClass
{
    private readonly MySettings _settings;

    public SomeClass(IOptions<MySettings> setitngs)
    {
        _settings = setitngs.Value // notice of using a .Value property
    }
}