C# 初始化存在IOptions注入问题的类
我刚开始用NetCore2.1构建一个API 我在appsettings.json中添加了连接字符串,我想访问它 appsettings.jsonC# 初始化存在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",
"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属性的注意事项
}
}
MaybeConfiguration.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
}
}