Saltar al contenido

Uso de IConfiguration en la biblioteca de clases de C #

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *