He revisado la documentación de configuración en el núcleo ASP.NET. La documentación dice que puede acceder a la configuración desde cualquier lugar de la aplicación.
A continuación se muestra Startup.cs creado por plantilla
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsEnvironment("Development"))
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(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, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}
}
Entonces, en Startup.cs
que configuramos todas las configuraciones, Startup.cs también tiene una propiedad llamadaConfiguration
¿Qué no puedo entender cómo accede a esta configuración en el controlador o en cualquier lugar de la aplicación? MS recomienda usar el patrón de opciones, pero solo tengo 4-5 pares clave-valor, por lo que me gustaría no usar el patrón de opciones. Solo quería tener acceso a Configuración en la aplicación. ¿Cómo lo inyecto en cualquier clase?
Respuestas:
Actualizar
El uso de ASP.NET Core 2.0 agregará automáticamente la
IConfiguration
instancia de su aplicación en el contenedor de inyección de dependencia. Esto también funciona en conjunto conConfigureAppConfiguration
elWebHostBuilder
.Por ejemplo:
Es tan fácil como agregar la
IConfiguration
instancia a la colección de servicios como un objeto singleton enConfigureServices
:¿Dónde
Configuration
está la instancia en tuStartup
clase?Esto le permite inyectar
IConfiguration
en cualquier controlador o servicio:fuente
IConfiguration
esa manera es muy permeable. Mucho mejor usar el patrón Opciones .En .NET Core puede inyectar
IConfiguration
como parámetro en su constructor de Clase, y estará disponible.Ahora, cuando desee crear una instancia de su clase, ya que su clase se inyecta
IConfiguration
, no podrá hacerlonew MyClass()
, ya que necesita unIConfiguration
parámetro inyectado en el constructor, por lo que deberá inyectar su clase como bien a la cadena de inyección, lo que significa dos pasos simples:1) Añadir a su clase / es - en las que desee utilizar el
IConfiguration
, a laIServiceCollection
en elConfigureServices()
método en elStartup.cs
2) Defina una instancia - digamos en el
Controller
, e inyecte usando el constructor:Ahora deberías poder disfrutar
_myClass.configuration
libremente ...Si todavía está buscando una manera de tenerlo disponible sin tener que inyectar las clases en el controlador, puede almacenarlo en un
static class
archivo, que configurará enStartup.cs
, algo como:Y su
Startup
constructor debería verse así:Luego, utilícelo
MyAppData.Configuration
en cualquier parte de su programa.No me enfrente por qué la primera opción es la correcta, solo puedo ver que los desarrolladores experimentados siempre evitan los datos basura en su camino, y es bien sabido que no es la mejor práctica tener un montón de datos disponibles en la memoria todo el tiempo, ni es bueno para el rendimiento ni para el desarrollo, y quizás también sea más seguro tener solo lo que necesita.
fuente
System.Configuration
que CORE volviera a la normalidad. Ahora, puede acceder a su buena aplicación anterior. Configuraciones como en los viejos tiempos. Y no estoy hablando de controladores aquí. Estamos hablando de componentes que tienen sus propias configuracionesSé que esto es antiguo, pero dados los patrones de IOptions es relativamente simple de implementar:
Clase con propiedades públicas get / set que coinciden con la configuración en la configuración
registre su configuración
inyectar a través de IOptions
No estoy seguro de por qué no harías esto.
fuente
Microsoft.Extensions.Configuration
,Microsoft.Extensions.Configuration.Binder
yMicrosoft.Extensions.Configuration.Json
a continuación, cargarappsettings.json
archivos comovar config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
..y también hay que asegurarse de queappsettings.json
la copia en el directorio de salida se ajusta acopy always
También hay una opción para hacer
configuration
estática en startup.cs para que pueda acceder a ella desde cualquier lugar con facilidad, las variables estáticas son convenientes, ¿eh?Esto hace que la configuración sea accesible desde cualquier lugar usando
Startup.Configuration.GetSection...
¿Qué puede salir mal?fuente
Lo estoy haciendo así en este momento:
Y luego uso esto donde necesito obtener los datos del archivo appsettings.json:
fuente
Miré la muestra del patrón de opciones y vi esto:
Al agregar Iconfiguration en el constructor de mi clase, pude acceder a las opciones de configuración a través de DI.
Ejemplo:
fuente
Sé que puede haber varias formas de hacer esto, estoy usando Core 3.1 y estaba buscando la opción óptima / más limpia y terminé haciendo esto:
fuente
En 8-2017, Microsoft salió con
System.Configuration
.NET CORE v4.4. Actualmente v4.5 y v4.6 vista previa.Para aquellos de nosotros, que trabajamos en la transformación de .Net Framework a CORE, esto es esencial. Permite mantener y usar
app.config
archivos actuales , a los que se puede acceder desde cualquier ensamblaje. Es probable que incluso sea una alternativaappsettings.json
, ya que Microsoft se dio cuenta de la necesidad. Funciona igual que antes en FW. Hay una diferencia:En las aplicaciones web, [por ejemplo, ASP.NET CORE WEB API] debe usar
app.config
y no web.config para suappSettings
oconfigurationSection
. Es posible que necesite usar,web.config
pero solo si implementa su sitio a través de IIS. Coloca configuraciones específicas de IIS enweb.config
Lo probé con netstandard20 DLL y Asp.net Core Web Api y todo funciona.
fuente
Usar el patrón de Opciones en ASP.NET Core es el camino a seguir. Solo quiero agregar, si necesita acceder a las opciones dentro de su startup.cs , le recomiendo hacerlo de esta manera:
CosmosDbOptions.cs:
Startup.cs:
fuente
Tengo que leer los propios parámetros al inicio.
Eso tiene que estar allí antes de que se inicie el WebHost (ya que necesito la url / IP "para escuchar" y el puerto del archivo de parámetros y aplicarlo al WebHost). Además, necesito la configuración pública en toda la aplicación.
Después de buscar durante un tiempo (no se encontró un ejemplo completo, solo fragmentos) y después de varios intentos y errores, he decidido hacerlo "a la antigua usanza" con un archivo .ini propio.
Entonces ... si quieres usar tu propio archivo .ini y / o configure el "para escuchar url / IP" propio y / o necesite la configuración pública, esto es para usted ...
Ejemplo completo, válido para core 2.1 (mvc):
Crear un archivo .ini - ejemplo:
por lo que los Dummyx solo se incluyen como ejemplo para otros tipos de fechas que no sean cadenas (y también para probar el caso "parámetro incorrecto" (ver código a continuación).
Se agregó un archivo de código en la raíz del proyecto, para almacenar las variables globales:
Cambió el código en program.cs (antes de CreateWebHostBuilder ()):
De esta manera:
Si, por ejemplo, se establece un tipo incorrecto (por ejemplo, * Dummy1 = gew7623 está activado en lugar de Dummy1 = true), el host muestra rojo la información está en la consola (incluida la excepción) y también puedo reaccionar en la aplicación (GV.bFehler_Ini se establece en verdadero, si hay errores con el .ini)
fuente