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étodoAddNotificationLibrary
. Esta función básicamente aplica la configuración que pasaste a través deoptions => { 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 claseExtensionMethods
que se encuentra en el espacio de nombresMicrosoft.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 servicioNotificationLibrary
. El parámetroconfigure
es del tipoAction<TOptions>
dondeTOptions
es el tipo de opciones que desea configurar.En su ejemplo, el tipo de opciones es
NotificationLibraryOptions
. Por lo tanto, puede utilizar el métodoConfigure
de la siguiente manera:csharp services.Configure
(configure); Esto configurará las opciones para el servicio
NotificationLibrary
utilizando la acción proporcionada en el parámetroconfigure
.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 claseIServiceCollection
. 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 objetomailFactory
, 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 objetomailFactory
.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