IOC容器3
一、Options注入模式
(相当于对appsettings.json根据字段映射到Model数据类,然后通过构造函数注入使用)
强类型的 Options
Options is a framework for accessing and configuring POCO settings.
简单来说,Options 就是将一个 POCO 的配置类,通过在Startup
类中注册到容器中,在后续使用的时候使用构造函数注入来获取到POCO对象。我们将这种编程模式称为Options模式。
语法格式:services.Configure<TOptions>(Options.Options.DefaultName, config);
TOptions作为实体类对象强类型
首先定义一个 Options:
public class MyOptions { public string DefaultValue { get; set; } }
然后我们在对应的appsettings.json
中添加如下片段:
{ "MyOptions": { "DefaultValue" : "first" } }
在Startup
中的ConfigureServices
方法中,进行服务的注册:
public void ConfigureServices(IServiceCollection services) { services.Configure<MyOptions>(Configuration.GetSection("MyOptions")); }
最后,便在控制器中注入IOptions<MyOptions>
,通过其Value
属性对MyOptions
进行访问:
[Route("api/[controller]")] public class ValuesController : Controller { private readonly MyOptions _options; public ValuesController(IOptions<MyOptions> options) { _options = options.Value; } [HttpGet] public string Get() { return _options.DefaultValue; } }
二、Configure 方法
Options框架为我们提供了一系统的IServiceCollection
的扩展方法,方便我们的使用。
直接使用Action配置
// 最简单的注册方式 services.Configure<MyOptions>(o => o.DefaultValue = true); // 指定具体名称 services.Configure<MyOptions>("my", o => o.DefaultValue = true); // 配置所有实例 services.ConfigureAll<MyOptions>(o => o.DefaultValue = true);
通过配置文件进行配置
// 使用配置文件来注册实例 services.Configure<MyOptions>(Configuration.GetSection("Sign")); // 指定具体名称 services.Configure<MyOptions>("my", Configuration.GetSection("Sign")); // 配置所有实例 services.ConfigureAll<MyOptions>(Configuration.GetSection("Sign"));
PostConfigure方法
PostConfigure
方法在 Configure
方法之后执行,是2.0中新增加的。
services.PostConfigure<MyOptions>(o => o.DefaultValue = true); services.PostConfigure<MyOptions>("smyign", o => o.DefaultValue = true); services.PostConfigureAll<MyOptions>(o => o.DefaultValue = true);
ConfigureNamedOptions
点到为止
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 回顾我的软件开发经历(1)
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· .NET 9 new features-C#13新的锁类型和语义
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会