Инициализация класса с проблемой внедрения IOptions - PullRequest
0 голосов
/ 29 января 2019

Я только начал создавать API с сетевым ядром 2.1.

Я добавил строку подключения в 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"));
        }

У меня есть класс, в котором я инициализирую SQLConnection, но мне нужно ввести параметры приложения, чтобы я прочитал строку подключения.

ConnectionManager.cs

    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);
        }

      }

Однако я хочу позвонить из другого класса.

CustomSqlConnection connection = new CustomSqlConnection()

Однако, IOptions<MyConfig> _Config показывает мне ноль.

Как лучше всего инициализировать класс, который вводит IOptions или любой другой интерфейс.

Ответы [ 3 ]

0 голосов
/ 29 января 2019

Вы можете использовать внедрение зависимостей в классе, который вы инициализируете 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
    }
}

ОБНОВЛЕНИЕ:

Вам нужно только внедрить класс, используяего интерфейс IYourNewClass в других классах.

public class SomeRandomClass
{    
    private IYourNewClass _newClass { get; set; }

    public SomeRandomClass(IYourNewClass newClass)
    {
       _newClass = newClass;
    }
}

И в вашем файле 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();
    }
}
0 голосов
/ 29 января 2019

Configuration.GetSection("MySettings") попытается найти раздел «MySettings» внутри файла appsettings.json.

MySettings класс должен выглядеть следующим образом:

public class MySettings
{
    public string connectionString { get; set; }
    public string Email { get; set; }
    public string SMTPPort { get; set; }
}

Тогда в Startup вы сможете настроить параметры для MySettings

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
    }
}
0 голосов
/ 29 января 2019

Возможно, сначала получите параметры из json, чтобы вы могли увидеть, работает ли он правильно, а затем настройте.

var config = configuration.GetSection("MySettings").Get<MyConfig>();

Затем, если это работает правильно:

services.Configure<MyConfig>(opts => 
{
    // map the properties here
    // opts.Property1 = config.Property1;
}

Также,убедитесь, что у вас установлены следующие пакеты NuGet:

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

...