J'ai essayé d'obtenir de la valeur à partir de mon appsettings.json qui est modélisé comme ceci:
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
SetRfid();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
public static void SetRfid()
{
var rfidClass = new RfidClass(); <-- MISSING ARGUMENT
}
}
Ensuite, j'ai créé un POCO comme ceci:
public class RfidClass
{
private readonly ConfigurationModel _configurationModel;
public RfidClass(IOptions<ConfigurationModel> configurationModel)
{
_configurationModel = configurationModel.Value;
}
public void sas()
{
Console.WriteLine(_configurationModel.RfidAddress);
}
}
Dans mon Startup.cs, j'ai ajouté le ConfigurationModel dans les services comme ceci:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.Configure<ConfigurationModel>(Configuration.GetSection("configurationModel"));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSignalR();
}
J'ai créé une classe qui utilisait ces paramètres comme ceci:
public class ConfigurationModel
{
public string RfidAddress { get; set; }
public int BaudRate { get; set; }
public int DataManagerTimeOut { get; set; }
}
Ensuite, dans mon Program.cs, je dois appeler cette classe que je viens de créer comme ceci:
"ConfigurationModel": {
"RfidAddress": "172.23.19.73",
"BaudRate": "152000",
"DataManagerTimeOut": "32000"
}
Comment puis-je passer le paramètre nécessaire instancier ma RfidClass?
3 Réponses :
Vous devriez pouvoir extraire la valeur en définissant le résultat du .Build () comme suit:
public class Program
{
public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
host.Run();
var config = host.Services.GetService<IConfiguration>();
var configSection = config.GetSection("ConfigurationModel");
var configModel = configSection.Get<ConfigurationModel>();
SetRfid(configModel);
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
public static void SetRfid(ConfigurationModel configModel)
{
var rfidClass = new RfidClass(configModel); <-- ADDED
}
}
J'ai un peu peur de dire que les classes de programme et de démarrage ne sont pas destinées à faire de telles choses. Habituellement, ces opérations sont appelées à partir d'autres classes, c'est-à-dire des classes de contrôleur. Publiez ceci, vous pouvez utiliser l'injection de dépendances pour passer les objets. Voici le code pour faire ça:
public HomeController(ILogger<HomeController> logger, RfidClass rfidClass)
{
...
}
Et voici le code du contrôleur:
public void ConfigureServices(IServiceCollection services) {
... services.Configure(Configuration.GetSection("configurationModel")); services.AddSingleton(m => { return new RfidClass(m.GetService>()); }); ... }
Vous semblez avoir tout configuré correctement pour utiliser le modèle d'options, mais essayez alors de new up RfidClass plutôt que d'injecter les options dans une classe comme un
code> Controller , View , Handler ou Middleware . Ces classes sont uniques en ce sens que le framework peut y injecter des services.
public class HomeController : Controller
{
private readonly RfidClass _rfidClass;
public HomeController(IOptionsMonitor<ConfigurationModel> options)
{
_rFidClass= options.CurrentValue;
}
public IActionResult Index()
{
var rfidAddress = _rfidClass.rfidAddress;
var baudRate = rfidClass.BaudRate;
// do stuff.
return View();
}
}
Il y a quelques informations intéressantes dans la documentation Microsoft sur l'utilisation du modèle d'options ici https://docs.microsoft.com/en-us/aspnet/ core / fundamentals / configuration / options? view = aspnetcore-3.1 .
vous ne devriez pas avoir cette méthode statique. vous devriez avoir un travailleur de fond.
J'ai juste besoin d'obtenir les valeurs de mes paramètres d'application
oui c'est dans votre conteneur di. vous devez initialiser les classes
Suis désolé. Je ne comprends pas ce que vous voulez dire ... De quelles classes ai-je besoin pour initialiser? le ConfigurationModel?