.Net Core中IOC容器的使用
本文由江北原创投稿,独家授权技术在于分享(公众号ID:sharecore),未经许可,不得转载。
作者:江北
打代码之前先说一下几个概念,那就是什么是IOC、DI、DIP
虽然网上讲这些的已经有很多了,我这里还是要再赘述一下
IOC容器就是一个工厂,负责创建对象的
IOC控制反转:只是把上端对下端的依赖,换成第三方容器决定
DI依赖注入:就是在构造某个对象时,能将对象依赖的东西自动的初始化进去
正是因为要实现IOC,所以才诞生了DI的技术手段
DIP就是上层模块不应该依赖底层模块,它们都应该依赖于抽象,具体点是Service不应该依赖于Repository,而应该依赖于IRepository
.Net Core中自带了轻量级的IOC的容器
依次是Transient、Scoped、Singleton
services.AddTransient<>():服务在每次请求时被创建,适合无状态的服务
services.AddScoped<>():服务每个请求只创建一次
services.Singleton<>():单例,只创建一次,第一次被请求的时候被创建
code部分:
定义一个接口ICacheContext和一个实现类CacheContext
假如我们现在想要使用CacheContext类中的方法,按照我们以前的思路肯定是:
//实例化
CacheContext context=new CacheContext();
//调用方法
context.method();
这就产生了依赖!我们要依赖于抽象不能依赖于具体实现细节,这样做:
//实例化
ICacheContext context=new CacheContext();
//调用方法
context.method();
接下来用IOC容器实现,将对象交给IOC容器托管。
这样之后可以使用构造函数、属性、方法进行注入
这里使用构造函数注入,如下:
接下来使用第三方IOC容器:Autofac
导包:Autofac与Autofac.Extensions.DependencyInjection
在Program中,加入如下代码:
public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory())//配置UseServiceProviderFactory.ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}
在Startup中加入一个方法:
public void ConfigureContainer(ContainerBuilder builder)
{builder.RegisterType<CacheContext>().As<ICacheContext>();
}
还是一样在Controller中使用构造函数注入,和上面一样
但是在真实的项目开发中不可能一个个的写
我们可以通过反射加载程序集的强名称,但是api层必须要对其引用
例如我这里api层引用了Icewo.BaseManage.MSSQLDB层
在ConfigureContainer方法中添加如下代码
var assemblysServicesNoInterfaces = Assembly.Load("Icewo.BaseManage.MSSQLDB");builder.RegisterAssemblyTypes(assemblysServicesNoInterfaces);
Icewo.BaseManage.MSSQLDB层是没有实现层的,也就是说他没有接口层
如果是有接口层的话,方法又不一样了
例如我这里有Business层和IBusiness层,如果api层直接对Business层进行引用,这就造成程序高度耦合。所以api层只引用IBusiness层=》DIP(依赖倒置)
在ConfigureContainer中添加如下方法:
注意:你要拷贝Business.dll到api层的bin目录下或者改一下输出路径,不然启动的时候会报错。
var basePath = Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath;var businessDllFile = Path.Combine(basePath, "Icewo.BaseManage.Business.dll");var assemblysBusiness = Assembly.LoadFrom(businessDllFile);builder.RegisterAssemblyTypes(assemblysBusiness).AsImplementedInterfaces().InstancePerDependency();
还是一样在Controllers中以构造函数注入的方式进行调用
水平有限,但是希望能帮到大家。
往期精彩回顾
.NETCore 实现容器化Docker与私有镜像仓库管理
10张图带你深入理解Docker容器和镜像
Linux容器技术原理和使用
点击【在看】与好友一起分享
.Net Core中IOC容器的使用相关推荐
- 关于Spring中IOC容器和AOP协同工作的原理理解
1.在详细介绍 IOC 容器的工作原理前,这里先介绍一下实现 IOC 所用到的一些辅助类,包括BeanDefinition.BeanReference.PropertyValues.PropertyV ...
- Spring中IOC容器
IOC入门案例思路分析 1.管理什么(Service和Dao) 2.如何将管理的对象存放到IOC容器(配置applicationContext.xml)第二步 3.将管理的对象存放到IOC容器,如何获 ...
- SpringMVC中IOC容器启动
在web.xml文件中有 <listener> <listener-class>org.springframework.web.context.ContextLoaderLis ...
- 手动实现Spring中的IOC容器
注意:这就是一个用于学习理解Spring中IOC容器的简单例子!!!! 1.IOC容器实现的过程: 加载XML的配置文件,并且遍历文件中的标签 获取配置文件中单个Bean的ID和Class属性,然后根 ...
- 反射 + 配置文件 实现IOC容器
IOC实现: IOC容器我们仅仅停留在知道上是不行的,我们要动手做印象对更深刻,那么我给大家看一个代码,看看代码中IOC容器的实现. 代码实现: 创建一个类库: 解决方案的类库建立: 创建一个实体类: ...
- 如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度
当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行. Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且提供了强大 ...
- Spring源码分析——IOC容器
1.IOC容器的概念 理解IOC容器的概念之前首先需要了解依赖翻转(又称依赖倒置)的概念 许多复杂的应用都是通过多个类之间的彼此合作实现业务逻辑的,这使得每个对象都需要管理自己与其合作对象的依赖,而如 ...
- Spring的IOC创建对象的方式和代码基本解释为什么要有ioc的思维以及Ioc容器和spring依赖注入的解释
首先我们要知道 Ioc是个啥? IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致 ...
- IoC容器Autofac(2) - 一个简单示例(附demo源码)
上篇文章中(IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc),我们用自己的方式实现了一个简陋的工厂类来实现IoC. 这里我们尝试使用Auotfac来替换我们的工厂类Mov ...
最新文章
- 数据分析之Pandas合并操作总结
- 面试02.01移除重复结点
- js:进一步关闭(范围:下一个)
- UNITY Profiler 真机调试
- [ An Ac a Day ^_^ ] CodeForces 468A 24 Game 构造
- 【Python入门】Python字符串的45个方法详解
- 经典html5网页,HTML5网页设计经典
- 《最后生还者:第二部》文学批评
- cad放大_dwg文件怎么打开?CAD看图,360°精确识别CAD图块,细节见真章
- 歌词服务器文件名,lrc是什么格式,MP3的LRC格式歌词同步方法
- 软件工程--总体设计过程包括那些步骤---软件设计过程中应该遵循那些基本原理--模块独立性
- S5P4418裸机开发(一):相关工具准备
- C语言中文网学习进度
- QDialog无边框
- 别害怕,C++容器的迭代器其实好用又不难
- 真实经历!运维安全工程师经典面试汇总
- python金融应用的好书推荐卡_十大金融好书推荐
- javascript 实现blob加密视频(html video),服务端为php
- 读取excel中的表格数据到字典dict中--python
- FlowNet2.0 win10系统疑难问题解决