Registrar un componente con IServiceCollection

Quiero construir mi NotificationLibrary así que se siente como un verdadero. Componente NET Core.

Esto es lo que quiero en mi clase de inicio

public void ConfigureServices(IServiceCollection services)
{
    services.AddNotificationLibrary(options =>
    {
        options.ConfigSectionName = "notificationSetup";
    });
}

Por lo tanto, los siguientes pasos deben ser configurar el NotificationLibrary con la configuración de appsetting. Json y regístrelo en DI.

Esto es lo que tengo tan lejos

namespace Microsoft.Extensions.DependencyInjection
{
public static class NotificationLibraryFactoryServiceCollectionExtensions
{
    public static IServiceCollection AddNotificationLibrary(
        this IServiceCollection services,
        Action configure)
    {
        if (services == null)
        {
            throw new ArgumentNullException(nameof(services));
        }

        if (configure != null)
        {
            services.Configure(configure);
        }

        services.AddScoped(provider =>
        {
            var mailFactory = new MailFactory();
            var configuration = provider.GetRequiredService();
            //var setup = configuration. /* How to I get the section name? */
            var config = new NotificationSetup();
            mailFactory.Configure(config);

            return mailFactory;
        });
        return services;
    }
}

}

Estoy almacenado recibiendo el nombre de la sección de config, y no entiendo qué servicios. Configure(configure); están haciendo.

Quiero crear un objeto poco de configration y añadirlo como un singleton a la colección de servicios. El siguiente paso sería llamar al correoFactory. Configure(config); y devolver el objeto de correoFactory.

Estoy cerca, pero ¿qué estoy perdiendo?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por coderchampion


3 Respuestas:

  • Resolver las opciones registradas en la colección de servicios

    public static IServiceCollection AddNotificationLibrary(
        this IServiceCollection services,
        Action configure) {
        if (services == null) {
            throw new ArgumentNullException(nameof(services));
        }
    
        if (configure != null) {
            services.Configure(configure);
        }
    
        services.AddScoped(provider => {
             /* How to I get the section name? */
            IOptions options = provider.GetRequiredService>();
            string sectionName = options.Value.ConfigSectionName;
            
            var configuration = provider.GetRequiredService();
            NotificationSetup config = configuration.GetSection(sectionName).Get();
            
            MailFactory mailFactory = new MailFactory();            
            mailFactory.Configure(config);
            return mailFactory;
        });
        return services;
    }
    

    Respondida el Dec 18, 2020 a las 12:42 - por codemaestro

    Votos positivos: 0 | Votos negativos: 0

  • El código que has mostrado se ve bastante bien. Sin embargo, hay algunas correcciones que debes hacer para que funcione correctamente.

    En cuanto a cómo obtener la sección de configuración llamada "notificationSetup" del archivo appsettings.json, puedes hacerlo de la siguiente manera:

    csharp
    var configuration = provider.GetRequiredService();
    var config = configuration.GetSection("notificationSetup").Get();
    

    Esto asume que tienes una clase NotificationSetup que coincide con la estructura de la sección de configuración "notificationSetup" en tu archivo appsettings.json.

    En cuanto a la función services.Configure(configure);, esto se utiliza para configurar las opciones del NotificationLibrary que estás pasando como parámetro en el método AddNotificationLibrary. Esta función básicamente aplica la configuración que pasaste a través de options => { options.ConfigSectionName = "notificationSetup"; }.

    Para agregar el objeto config como singleton al contenedor de servicios, puedes hacerlo de la siguiente manera:

    csharp
    services.AddSingleton(config);
    

    Asegúrate de hacer estas correcciones en tu código para que funcione como esperas.

    Respondida el Dec 19, 2020 a las 12:42 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener el nombre de la sección de configuración, puede utilizar el método GetSectionName de la clase ExtensionMethods que se encuentra en el espacio de nombres Microsoft.Extensions.Configuration. Este método toma un nombre de sección como parámetro y devuelve el nombre de la sección completa.

    Así es como puedes usarlo en tu código:

    csharp
    var setup = configuration.GetSectionName("notificationSetup");
    

    El método services.Configure(configure) se utiliza para configurar opciones para un servicio registrado. En su caso, puede utilizarlo para configurar las opciones para el servicio NotificationLibrary. El parámetro configure es del tipo Action<TOptions> donde TOptions es el tipo de opciones que desea configurar.

    En su ejemplo, el tipo de opciones es NotificationLibraryOptions. Por lo tanto, puede utilizar el método Configure de la siguiente manera:

    csharp
    services.Configure(configure);
    

    Esto configurará las opciones para el servicio NotificationLibrary utilizando la acción proporcionada en el parámetro configure.

    Para crear un objeto de configuración y agregarlo como un singleton a la colección de servicios, puede utilizar el método AddSingleton de la clase IServiceCollection. Este método toma un tipo y una fábrica como parámetros y agrega una instancia del tipo a la colección de servicios como un singleton.

    Así es como puedes usarlo en tu código:

    csharp
    services.AddSingleton(provider =>
    {
        var configuration = provider.GetRequiredService();
        var setup = configuration.GetSection("notificationSetup").Get();
        return setup;
    });
    

    Esto agregará una instancia de NotificationSetup a la colección de servicios como un singleton.

    Finalmente, para llamar al método mailFactory.Configure(config) y devolver el objeto mailFactory, puede utilizar el siguiente código:

    csharp
    var mailFactory = new MailFactory();
    var config = provider.GetRequiredService();
    mailFactory.Configure(config);
    return mailFactory;
    

    Esto llamará al método mailFactory.Configure(config) y devolverá el objeto mailFactory.

    Espero que esto ayude a resolver los problemas que encontraste en tu código.

    Respondida el Dec 19, 2020 a las 12:47 - por Gemini

    Votos positivos: 0 | Votos negativos: 0