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