.net core 向IServiceCollection注册组件

.net core 向IServiceCollection注册组件,.net-core,dependency-injection,.net Core,Dependency Injection,我想构建我的NotificationLibrary,让它看起来像一个真正的.NET核心组件 这就是我在创业课上想要的 public void ConfigureServices(IServiceCollection services) { services.AddNotificationLibrary(options => { options.ConfigSectionName = "notificationSetup"; });

我想构建我的NotificationLibrary,让它看起来像一个真正的.NET核心组件

这就是我在创业课上想要的

public void ConfigureServices(IServiceCollection services)
{
    services.AddNotificationLibrary(options =>
    {
        options.ConfigSectionName = "notificationSetup";
    });
}
因此,接下来的步骤应该是使用appsetting.json中的配置配置NotificationLibrary,并在DI中注册它

这就是我所拥有的一切

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

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

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

            return mailFactory;
        });
        return services;
    }
}
名称空间Microsoft.Extensions.DependencyInjection
{
公共静态类通知LibraryFactoryServiceCollectionExtensions
{
公共静态IServiceCollection添加通知库(
这是电子收款服务,
操作(配置)
{
if(服务==null)
{
抛出新的ArgumentNullException(nameof(services));
}
如果(配置!=null)
{
服务。配置(Configure);
}
services.AddScoped(provider=>
{
var mailFactory=new mailFactory();
var configuration=provider.GetRequiredService();
//var setup=configuration./*如何获取节名*/
var config=new NotificationSetup();
配置(config);
退货工厂;
});
返回服务;
}
}
}

我正在获取配置部分的名称,但我不了解哪些服务;你在做什么

我想创建一个configration poco对象,并将其作为单例添加到服务集合中。下一步是调用mailFactory.Configure(config);并返回mailFactory对象


我很接近,但我缺少什么?

解决在服务集合中注册的选项

public static IServiceCollection AddNotificationLibrary(
    this IServiceCollection services,
    Action<NotificationLibraryOptions> configure) {
    if (services == null) {
        throw new ArgumentNullException(nameof(services));
    }

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

    services.AddScoped<IMailFactory, MailFactory>(provider => {
         /* How to I get the section name? */
        IOptions<NotificationLibraryOptions> options = provider.GetRequiredService<IOptions<NotificationLibraryOptions>>();
        string sectionName = options.Value.ConfigSectionName;
        
        var configuration = provider.GetRequiredService<IConfiguration>();
        NotificationSetup config = configuration.GetSection(sectionName).Get<NotificationSetup>();
        
        MailFactory mailFactory = new MailFactory();            
        mailFactory.Configure(config);
        return mailFactory;
    });
    return services;
}
公共静态IServiceCollection AddNotificationLibrary(
这是电子收款服务,
操作(配置){
if(服务==null){
抛出新的ArgumentNullException(nameof(services));
}
如果(配置!=null){
服务。配置(Configure);
}
services.AddScoped(provider=>{
/*如何获取分区名称*/
IOOptions=provider.GetRequiredService();
string sectionName=options.Value.ConfigSectionName;
var configuration=provider.GetRequiredService();
NotificationSetup config=configuration.GetSection(sectionName).Get();
MailFactory MailFactory=新的MailFactory();
配置(config);
退货工厂;
});
返回服务;
}

So服务。配置(Configure);使此行成为可能的提供程序。GetRequiredService()@是的。这是.NETCore中选项模式的一部分。