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 me montre null.
Quelle est la meilleure pratique pour initialiser une classe qui injecte IOptions ou toute autre interface.
3 Réponses :
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>();
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.
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
}
}
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
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; }
}
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.
Peut-être
Configuration.GetSection ("MySettings")J'ai juste besoin de quelques éclaircissements. Votre classe
MyConfigest 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