ASP.NET Core 下的依赖注入(一)

ASP.NET Core 下的依赖注入(一),第1张

概述本文介绍利用 Microsoft.Extensions.Configuration.Binder.dll 来实现超级简单的注入。   1. appsettings.json 中定义配置 假设我们有如下配置: { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warni

本文介绍利用 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 interface ITecentConfig    {        QzoneConfig Qzone { get; set; }    }

 

    public class TecentConfig : ITecentConfig    {        public QzoneConfig Qzone { get; set; }    }

 

    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. 效果图

 

 

 

谢谢浏览!

总结

以上是内存溢出为你收集整理的ASP.NET Core 下的依赖注入(一)全部内容,希望文章能够帮你解决ASP.NET Core 下的依赖注入(一)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1233748.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存