2
votes

Initialiser la classe avec un problème d'injection IOptions

Je viens de commencer à créer une API avec net core 2.1.

J'ai ajouté ma chaîne de connexion dans appsettings.json et je veux y accéder.

appsettings.json strong >

CustomSqlConnection connection = new CustomSqlConnection()

J'ai d'abord ajouté le gestionnaire de configuration dans startup.cs afin que je puisse injecter dans d'autres classes

startup.cs strong >

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

      }

J'ai une classe dans laquelle j'initialise ma SQLConnection, mais je dois injecter les paramètres de l'application pour que je lise la chaîne de connexion.

ConnectionManager.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.Configure<MyConfig>(Configuration.GetSection("appsettings"));
        }

Cependant, je souhaite appeler depuis une autre classe.

  "MySettings": {
    "connectionString": "Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=Subscription;Data Source=Test-Pc",
    "Email": "abc@domain.com",
    "SMTPPort": "5605"
  }

Cependant, IOptions _Config me montre null.

Quelle est la meilleure pratique pour initialiser une classe qui injecte IOptions ou toute autre interface.


4 commentaires

Peut-être Configuration.GetSection ("MySettings")


J'ai juste besoin de quelques éclaircissements. Votre classe MyConfig est la même que la classe `appsettings.json, non?


Oui c'est pareil. btw ne trouve pas Configuration.GetSection.


Possible duplication de Impossible d'injecter des IOptions en service


3 Réponses :


0
votes

Peut-être obtenir d'abord les paramètres de json pour voir si cela fonctionne correctement, puis configurer.

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

Ensuite, si cela fonctionne correctement:

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


2 commentaires

configuration.GetSection ne fonctionne pas, j'ai injecté tous ces packages. Peut-être que je viens de remarquer que cz est 2.1?


Vérifiez les propriétés de votre appsettings.json. Peut-être qu'il n'est pas copié dans le répertoire de construction.



0
votes

Vous pouvez utiliser l'injection de dépendances dans la classe que vous initialisez l'objet CustomSqlConnection .

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

UPDATE:

Il vous suffit d'injecter la classe en utilisant son interface IYourNewClass dans d'autres classes.

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

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

Et dans votre startup.cs configurez vos paramètres d'applications avant mvc .

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


2 commentaires

Le problème est que si je dois initialiser YourNewClass, je dois recommencer le même processus.


Comme dans la réponse modifiée, vous pouvez voir comment utiliser YourNewClass @MissakBoyajian



2
votes

Configuration.GetSection ("MySettings") essaiera de trouver une section "MySettings" à l'intérieur du fichier appsettings.json. La classe

MySettings devrait ressembler à celle ci-dessous

public class SomeClass
{
    private readonly MySettings _settings;

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

Ensuite, dans Startup, vous pourrez configurer les options pour MySettings code >

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<MyConfig>(Configuration.GetSection("MySettings"));
}

Et l'utilisation des paramètres

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


2 commentaires

mais comment initialiser la SomeClass? comme le nouveau SomeClass ()?


@MissakBoyajian, que l'idée d'injection de dépendance, vous ne le faites pas. Vous devez enregistrer la classe et introduire comme argument constructeur de la classe qui l'utilisera.