Solución:
Las bibliotecas de clases de la OMI deben ser independientes de los datos de configuración de la aplicación. Generalmente, el consumidor de la biblioteca es el que se preocupa por estos detalles. Sí, esto no siempre es cierto (por ejemplo, si tiene una clase que realiza cifrado / descifrado RSA, es posible que desee alguna configuración privada para permitir la generación / almacenamiento de claves privadas), pero en su mayor parte, es cierto.
Entonces, en general, intente mantener la configuración de la aplicación fuera de la biblioteca de clases y haga que el consumidor proporcione dichos datos. En su comentario menciona una cadena de conexión a una base de datos. Este es un ejemplo perfecto de datos que deben mantenerse FUERA de una biblioteca de clases. A la biblioteca no debería importarle a qué base de datos está llamando para leer, solo que necesita leer desde una. Ejemplo a continuación (me disculpo si hay algunos errores ya que estoy escribiendo esto sobre la marcha de la memoria):
Biblioteca
Clase de biblioteca que usa una cadena de conexión
public class LibraryClassThatNeedsConnectionString
private string connectionString;
public LibraryClassThatNeedsConnectionString(string connectionString)
this.connectionString = connectionString;
public string ReadTheDatabase(int somePrimaryKeyIdToRead)
var result = string.Empty;
// Read your database and set result
return result;
Solicitud
appsettings.json
"DatabaseSettings":
"ConnectionString": "MySuperCoolConnectionStringWouldGoHere"
DatabaseSettings.cs
public class DatabaseSettings
public string ConnectionString get; set;
Startup.cs
public class Startup
public Startup(IHostingEnvironment env)
Configuration = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.env.EnvironmentName.json", optional: true)
.AddEnvironmentVariables()
.Build();
public IConfigurationRoot Configuration get;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
// Setup logging
// Configure app
public void ConfigureServices(IServiceCollection services)
// Configure services
services.Configure<DatabaseSettings>(Configuration.GetSection("DatabaseSettings"));
services.AddOptions();
// Register our class that reads the DB into the DI framework
services.AddTransient<IInterfaceForClass, ClassThatNeedsToReadDatabaseUsingLibrary>();
Clase que usa la clase de biblioteca para leer la base de datos
public interface IInterfaceForClass
string ReadDatabaseUsingClassLibrary(int somePrimaryKeyIdToRead);
public class ClassThatNeedsToReadDatabaseUsingLibrary : IInterfaceForClass
private DatabaseSettings dbSettings;
private LibraryClassThatNeedsConnectionString libraryClassThatNeedsConnectionString;
public ClassThatNeedsToReadDatabaseUsingLibrary(IOptions<DatabaseSettings> dbOptions)
this.dbSettings = dbOptions.Value;
this.libraryClassThatNeedsConnectionString = new LibraryClassThatNeedsConnectionString(this.dbSettings.ConnectionString);
public string ReadDatabaseUsingClassLibrary(int somePrimaryKeyIdToRead)
return this.libraryClassThatNeedsConnectionString.ReadTheDatabase(somePrimaryKeyIdToRead);
Alguna clase de controlador que maneja cosas de la interfaz de usuario para leer desde la base de datos
public class SomeController : Controller
private readonly classThatReadsFromDb;
public SomeController(IInterfaceForClass classThatReadsFromDb)
this.classThatReadsFromDb = classThatReadsFromDb;
// Controller methods
TL; DR
Intente evitar el uso de la configuración de la aplicación en una biblioteca de clases. En su lugar, haga que su biblioteca de clases sea independiente de tales configuraciones y deje que el consumidor pase esas configuraciones.
Editar:
Agregué la inyección de dependencia en una clase de controlador para demostrar el uso de la inyección de dependencia para construir la clase que lee desde la base de datos. Esto permite que el sistema DI resuelva las dependencias necesarias (por ejemplo, las opciones DB).
Esta es una forma de hacerlo (y la mejor forma). Otra forma es inyectar las IOptions en el controlador y crear manualmente la clase que lee de la base de datos y pasar las opciones (no es la mejor práctica, DI es una mejor manera de hacerlo)
Esto debería funcionar. Necesita instalar el paquete Microsoft.Extensions.Configuration.Json
public static class Config
private static IConfiguration configuration;
static Config()
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
configuration = builder.Build();
public static string Get(string name)
string appSettings = configuration[name];
return appSettings;
Nunca lo usé, pero una búsqueda rápida me llevó a esto …
var configuration = new Configuration();
configuration.AddJsonFile("config.json");
var emailAddress = configuration.Get("emailAddress");
Tal vez podrías intentar eso.