c# - net - read appsettings.json from class library
Acceso desde la biblioteca de clases a appsetting.json en Asp.net-core (3)
Estoy intentando acceder appsetting.json
archivo appsetting.json
desde una biblioteca de clases. Hasta ahora, la solución que encontré es crear una clase de configuración que implementa la interfaz IConfiguration
de Microsoft.Extensions.Configuration
y agregar el archivo json a la clase y leer de la misma.
var configuration = new Configuration();
configuration.AddJsonFile("appsetting.json");
var connectionString= configuration.Get("connectionString");
Esta parece ser una mala opción ya que tenemos que agregar el archivo json cada vez que tengamos que acceder a la configuración de configuración. No tenemos ninguna alternativa como ConfigurationManager
en ASP.NET .
Sé que la pregunta tiene una respuesta aceptada, pero la pregunta es sobre las bibliotecas de clases y la forma de leer appsettings.json desde una biblioteca de clases es la siguiente:
Cree un modelo que tenga las propiedades que coincidan con las de su archivo de configuración:
public class ConfigurationManager
{
public string BaseUrl { get; set; }
}
Agregue la configuración real en su appsettings.json
"ConfigurationManager": {
"BaseUrl": "myValue"
}
Ahora registre la sección appsettings.json con su modelo en startup.cs:
services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));
En tu biblioteca de clases crea una clase que esté usando
using Microsoft.Extensions.Options;
Y consigue tus ajustes de configuración:
using Microsoft.Extensions.Options;
public class KeyUrls: IKeyUrls
{
public string BaseUrl = "";
private readonly IOptions<ConfigurationManager> _configurationService;
public KeyUrls(IOptions<ConfigurationManager> configurationservice)
{
_configurationService = configurationservice;
BaseUrl = _configurationService.Value.BaseUrl;
}
public string GetAllKeyTypes()
{
return $"{BaseUrl}/something";
}
public string GetFilteredKeys()
{
return $"{BaseUrl}/something2";
}
}
Para más detalles verifique This
Sé que ya se ha aceptado una respuesta, pero esta pregunta es un gran éxito en Google y la pregunta de OP es sobre bibliotecas de clases y no una aplicación web ASP.NET o una WebApi, que es la que utiliza la respuesta aceptada.
En mi opinión, las bibliotecas de clases no deben usar la configuración de la aplicación y deben ser ajenas a tales configuraciones. Si necesita configuraciones de aplicaciones en su biblioteca de clases, debe proporcionar esas configuraciones de su consumidor. Puedes ver un ejemplo de esto en esta pregunta SO
Supongo que desea acceder al archivo appsettings.json
desde la aplicación web ya que las bibliotecas de clases no tienen un appsettings.json
de forma predeterminada.
Creo una clase modelo que tiene propiedades que coinciden con la configuración en una sección en appsettings.json
.
Sección en appsettings.json
"ApplicationSettings": {
"SmtpHost": "mydomain.smtp.com",
"EmailRecipients": "[email protected];[email protected]"
}
Clase de modelo a juego
namespace MyApp.Models
{
public class AppSettingsModel
{
public string SmtpHost { get; set; }
public string EmailRecipients { get; set; }
}
}
Luego, IOptions
esa clase de modelo y agréguela a la colección IOptions
en el contenedor DI (esto se hace en el método Configure()
de la clase Startup).
services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings"));
// Other configuration stuff
services.AddOptions();
Luego, puede acceder a esa clase desde cualquier método que el marco llame agregándolo como un parámetro en el constructor. El marco se encarga de encontrar y proporcionar la clase al constructor.
public class MyController: Controller
{
private IOptions<AppSettingsModel> settings;
public MyController(IOptions<AppSettingsModel> settings)
{
this.settings = settings;
}
}
Luego, cuando un método en una biblioteca de clase necesita la configuración, o bien paso la configuración individualmente o todo el objeto.