本文介绍利用 Microsoft.Extensions.Configuration.Binder.dll 来实现超级简单的注入。
1. appsettings.json 中定义配置
假设我们有如下配置:
{ "Logging": { "LogLevel": { "Default": "information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "information" } },"AllowedHosts": "*","Tecent": { "Qzone": { "Url": "http://i.qq.com","CName": "QQ空间","Age": 15 },"Weixin": { } } }
2. 定义配置模型类
public class QzoneConfig { public string Url { get; set; } public string CName { get; set; } public int Age { get; set; } }
3. Nuget 中引用 Microsoft.Extensions.Configuration.Binder.dll
4. 编写 ServiceCollection 的扩展方法
public static class ServiceCollectionExtensions { public static void Configureapplicationservices(this IServiceCollection services,IConfiguration configuration) { ITecentConfig tencentConfig = services.ConfigureStartupConfig<ITecentConfig,TecentConfig>(configuration.GetSection("Tecent")); //由于已经通过依赖注入了,并且单例模式,下面通过依赖注入读取配置。 } public static TConfig ConfigureStartupConfig<TConfig>(this IServiceCollection services,IConfiguration configuration) where TConfig : class,new() { if (services == null) throw new ArgumentNullException(nameof(services)); if (configuration == null) throw new ArgumentNullException(nameof(configuration)); var config = new TConfig(); configuration.Bind(config); services.AddSingleton(config); //.NET Core DI 为我们提供的实例生命周其包括三种: //Transient: 每一次GetService都会创建一个新的实例 //Scoped: 在同一个Scope内只初始化一个实例 ,可以 // 理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内) //Singleton :整个应用程序生命周期以内只创建一个实例 return config; } public static IConfig ConfigureStartupConfig<IConfig,ConfigImpl>(this IServiceCollection services,IConfiguration configuration) where ConfigImpl : class,IConfig,new() { if (services == null) throw new ArgumentNullException(nameof(services)); if (configuration == null) throw new ArgumentNullException(nameof(configuration)); var config = new ConfigImpl(); configuration.Bind(config); services.AddSingleton(typeof(IConfig),config); return config; } }
这里需要解释一下,这里有 2 个重载方法 ConfigureStartupConfig, 第一个表示不用接口(或者抽象父类),直接读取配置成我们自己的配置模型,然后依赖注入单例。第二个方法表示只依赖接口或者抽象父类(指:我们自己定义的 ITencentConfig),不依赖具体的子类(指:我们自己定义的 TecentConfig)。
5. 在 Startup.cs 中注册服务
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.CheckConsentNeeded = context => true; }); services.Configureapplicationservices(Configuration);//注册我们自定义的服务 //注册自定义的模型绑定 services.AddMvc() .AddNewtonsoftJson(); services.AddRazorPages(); } }
6. MVC 控制器中构造函数注入
public class HomeController : Controller { private ITecentConfig _tecentConfig; public HomeController(ITecentConfig tecentConfig) { _tecentConfig = tecentConfig; } public IActionResult About() { return Content(string.Format("这个是 About 介绍。{0}: {1}。HashCode:{2}",_tecentConfig.Qzone.CName,_tecentConfig.Qzone.Url,_tecentConfig.GetHashCode() ) ); } }
7. 效果图
谢谢浏览!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。