NetCore依赖注入
一、配置文件的读取
利用Startup类中的configuration读取appsettings.json中的配置 { "Logging": { "LogLevel": { "Default": "Warning" } }, "option1": "value1_from_json", "option2": 2, "subsection": { "suboption1": "subvalue1_from_json", "Read": [ "Data Source=.; Database=Customers_New1; User ID=sa; Password=Passw0rd; MultipleActiveResultSets=True", "Data Source=ElevenPC; Database=Customers_New2; User ID=sa; Password=Passw0rd; MultipleActiveResultSets=True", "Data Source=.; Database=Customers_New3; User ID=sa; Password=Passw0rd; MultipleActiveResultSets=True" ] }, "wizards": [ { "Name": "Gandalf", "Age": "1000" }, { "Name": "Harry", "Age": "17" } ], "AllowedHosts": "*" } public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } this.Configuration["Option1"] this.Configuration["subsection:suboption1"] string[] _SqlConnectionStringRead = this._iConfiguration.GetSection("subsection").GetSection("Read").GetChildren().Select(s => s.Value).ToArray(); 二、自带IOC容器1.基本使用NuGet安装引用Microsoft.Extensions.DependencyInjection; 实例化容器 注册服务 创建一个System.IServiceProvider提供程序 创建实例 using Microsoft.Extensions.DependencyInjection; IServiceCollection container = new ServiceCollection(); container.AddTransient(); IServiceProvider provider = container.BuildServiceProvider(); _Interface interface = provider.GetService<_Interface>() 2.服务类型
1.container.AddTransient为瞬时生命周期,每次创建都是一个全新的实例 IServiceCollection container = new ServiceCollection(); container.AddTransient(); IServiceProvider provider = container.BuildServiceProvider(); _Interface interface = provider.GetService<_Interface>(); _Interface interface2 = provider.GetService<_Interface>(); bool bResult = object.ReferenceEquals(interface, interface2); //b is false
2.container.AddSingleton单例:全容器都是一个 IServiceCollection container = new ServiceCollection(); container.AddSingleton(); IServiceProvider provider = container.BuildServiceProvider(); _Interface interface = provider.GetService<_Interface>(); _Interface interface2 = provider.GetService<_Interface>(); bool bResult = object.ReferenceEquals(interface, interface2); //b is True
3.container.AddScoped请求单例,一个请求代表一个作用域 IServiceCollection container = new ServiceCollection(); container.AddScoped(); IServiceProvider provider = container.BuildServiceProvider(); //创建一个Scope作用域,那么由这个域创建的实例是独立的(相较Scope1) IServiceScope Scope = provider.CreateScope(); //创建一个Scope1作用域,那么由这个域创建的实例是独立的 IServiceScope Scope1 = provider.CreateScope(); _Interface interface =Scope.ServiceProvider.GetService<_Interface>(); _Interface interface2 = Scope1.ServiceProvider.GetService<_Interface>(); bool bResult = object.ReferenceEquals(interface, interface2); //b is false 三、自带IOC容器(IServiceCollection)基础1.生命周期
1.瞬时,即时构造,即时销毁 services.AddTransient();
2.单例,永远只构造一次 services.AddSingleton();
3.作用域单例,一次请求只构造一个 services.AddScoped(); 2.实例解析public TestServiceA() { Console.WriteLine(#34;{this.GetType().Name}被构造…"); } public TestServiceB(ITestServiceA iTestServiceA) { Console.WriteLine(#34;{this.GetType().Name}被构造…"); } public TestServiceC(ITestServiceB iTestServiceB) { Console.WriteLine(#34;{this.GetType().Name}被构造…"); } public TestServiceD() { Console.WriteLine(#34;{this.GetType().Name}被构造…"); } public TestServiceE(ITestServiceC serviceC) { Console.WriteLine(#34;{this.GetType().Name}被构造…"); } //1.A类构造 //2.B类构造需要A类 //3.C类构造需要B类 //4.D类构造 //5.E类构造需要C类 //瞬时 services.AddTransient(); //单例 services.AddSingleton(); //作用域单例 services.AddScoped(); //瞬时 services.AddTransient(); //瞬时 services.AddTransient();
第一次请求解析
1.开始构造A类,因为是瞬时生命周期那么第一次请求就会被构造,然后销毁
2.在构造B类时需要A类,那么会首先构造A类(因为A类瞬时上一次已经被销毁),然后构造B类为单例
3.开始构造C,在构造时需要B类,因为B类全局单例,那就会直接构造C为作用域单例
4.直接构造瞬时D类
5.开始构造E类,构造式需要C类,因为C类为作用域单例,那么就会直接构造E类为瞬时
第一次请求结论 输出A 输出A,B 输出C 输出D 输出E
第二次请求解析
1.开始构造A类,因为是瞬时生命周期那么第二次请求就会重新被构造,然后销毁
2.在构造B类时因为在第一次请求时已经构造为单例,所以不再被构造
3.开始重新构造C,因为C在第二次请求为新的作用域,在构造时需要B类,因为B类全局单例,那就会直接构造C为作用域单例
4.直接构造瞬时D类
5.开始构造E类,构造式需要C类,因为C类为作用域单例,那么就会直接构造E类为瞬时
第二次请求结论
1.输出A
2.输出C
3.输出D
4.输出E
如果不想通过构造全部自动注入,能自定义注入
1.using Microsoft.Extensions.DependencyInjection;
2.首先注入 IServiceProvider serviceProvider,利用serviceProcider.GetService();生成需要的实例 四、利用AutoFac容器替换自带容器
1.下载Autofac.Extensions.DependencyInjection和Autofac包
2.在Program网站启动时替换默认IOC工厂实例为Autofac,UseServiceProviderFactory(new AutofacServiceProviderFactory())
3.在Startup类中添加方法public void ConfigureContainer(ContainerBuilder services){services.RegisterType().As().SingleInstance();} //返回值为IServiceProvider public IServiceProvider ConfigureContainer(ContainerBuilder services) { services.Configure(options => { options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddSession(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); //services.RegisterType().As().SingleInstance(); services.RegisterModule(); } 1.批量注册模块 public class CustomAutofacModule : Module { //重新load 添加注册服务 //可以实现实例控制 //接口约束 protected override void Load(ContainerBuilder containerBuilder) { containerBuilder.Register(c => new CustomAutofacAop()); //设置为属性注入 containerBuilder.RegisterType().As().SingleInstance().PropertiesAutowired(); containerBuilder.RegisterType().As(); containerBuilder.RegisterType().As(); containerBuilder.RegisterType().As(); containerBuilder.RegisterType().As().EnableInterfaceInterceptors(); } } 五、利用AutoFac实现AOP1.基本使用
1.NuGet安装引用Autofac.Extras.DynamicProxy
2.引用using Autofac.Extras.DynamicProxy;
3.创建类库继承自IInterceptor实现接口
4.自定义的Autofac的AOP扩展 //注册,模块 public class CustomAutofacModule : Module { //重新load 添加注册服务 //可以实现实例控制 //接口约束 protected override void Load(ContainerBuilder containerBuilder) { //注册AOP containerBuilder.Register(c => new CustomAutofacAop()); //开启aop扩展 containerBuilder.RegisterType().As().EnableInterfaceInterceptors(); } } public class CustomAutofacAop : IInterceptor { public void Intercept(IInvocation invocation) { Console.WriteLine(#34;invocation.Methond={invocation.Method}"); Console.WriteLine(#34;invocation.Arguments={string.Join(",", invocation.Arguments)}"); invocation.Proceed(); //继续执行 Console.WriteLine(#34;方法{invocation.Method}执行完成了"); } }
5G下凡WiFi何去何从?全析2017无线市场走势无线市场已步入了2017下半年的关键时期,5G网络呼之欲出,4G无限流量备受亲睐,WiFi将迎来哪些机遇和挑战?无线市场纷争不断,普联华为思科等品牌大鳄独揽半壁江山,EDUP360
翼联网络2018年新春联欢会热烈举办1月31日晚,深圳市翼联网络有限公司2018年新春联欢会在华强广场大酒店24楼热烈举办,湖北独臂铁人梅立军先生等嘉宾受邀出席了此次盛会。凛冽寒风挡不住似火热情,近百位员工和嘉宾盛装
某村千人数据详解2017无线路由器选购十大痛点2017年移动互联网继续高歌猛进,以智能手机可穿戴设备可连网终端等为代表的智能硬件数量持续增长,对家中的无线网络提出了新的承载需求。为此,ZOL(中关村)网络设备频道在近3周内展开
天上掉下个WiFi来?无线网卡这么用台式机要上天!21岁重庆小伙小王,在网吧上网玩英雄联盟。玩兴正酣,结果网速卡了一下,直接被人秒杀。小王当时就火了,一把操起鼠标狠狠砸了显示屏。终因拒不赔偿被拘8日。常州18岁少年周某,在网吧上网
上WiFi玩网游台式机这招溜溜溜眼看公司小伙伴都能正常办公,小刘的台式机又断网了!张工,帮忙看看嘛。IP冲突?网线故障?接口不良?电脑病毒?忙活半天勉强解决,小刘老张叫苦不迭。租房的小年轻,拿台式机消遣周末的明媚
WiFi还能玩这样?到底还是贫穷限制了我的想象!供职于某CBD地下食堂年薪过万的张哥,下班后拖着疲惫身躯,搭乘身价动辄千万的座驾地铁,回到了家。WiFi手机沙发,那个幸福舒坦啊。十八线小县城,几个小伙伴放学后可劲跑,早早功课写完
怎么选择一款好的无线网卡?对于喜欢玩吃鸡游戏的朋友们来说,网络卡顿对于游戏的胜负而言无疑是致命的。一般的路由器都会有一个网速衰减机制,如果路由器配置很高,但是却离路由器太远,信号就会衰减太多,那么玩游戏也就
齐聚襄阳,翼联助力独臂铁人圆梦想9月16日,来自世界各地的200多名铁三聚集湖北襄阳,积极参加襄阳南漳春秋寨铁人三项赛,继而在南漳春秋寨上演了一场速度与激情的体育盛会。此次参赛由南漳三特古山寨旅游开发有限公司主办
4G无线路由器,带给你不一样的体验路由器是我们每个现代人生活中最不可或缺的设备,不过在某些时候,传统的路由器可能就不太灵了,比如刚建好没通网的小区,或是新租的房子还来不及办理宽带网,又或者是某些特殊场合。这种时候若
举国同庆,翼联人依然坚守一线金秋十月,踏着如歌的节拍,沐浴在明媚的阳光下,我们如约迎来了祖国69岁华诞!3日,当大家正在享受十一假期和家人团聚或者携三五好友外出旅游的时候,深圳翼联EDUP的部分优秀员工却放弃
祝贺深圳翼联EDUP首届产品知识答辩会取得圆满成功为提高全体员工专业知识水平,促进公司的持续健康发展,打造高效的营销团队,深圳翼联EDUP首届产品知识答辩大会于今天下午隆重举行!主持开场公司全体部门包括财务部,营销部,人事行政部,