本文由江北原创投稿,独家授权技术在于分享(公众号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容器的使用相关推荐

  1. 关于Spring中IOC容器和AOP协同工作的原理理解

    1.在详细介绍 IOC 容器的工作原理前,这里先介绍一下实现 IOC 所用到的一些辅助类,包括BeanDefinition.BeanReference.PropertyValues.PropertyV ...

  2. Spring中IOC容器

    IOC入门案例思路分析 1.管理什么(Service和Dao) 2.如何将管理的对象存放到IOC容器(配置applicationContext.xml)第二步 3.将管理的对象存放到IOC容器,如何获 ...

  3. SpringMVC中IOC容器启动

    在web.xml文件中有 <listener> <listener-class>org.springframework.web.context.ContextLoaderLis ...

  4. 手动实现Spring中的IOC容器

    注意:这就是一个用于学习理解Spring中IOC容器的简单例子!!!! 1.IOC容器实现的过程: 加载XML的配置文件,并且遍历文件中的标签 获取配置文件中单个Bean的ID和Class属性,然后根 ...

  5. 反射 + 配置文件 实现IOC容器

    IOC实现: IOC容器我们仅仅停留在知道上是不行的,我们要动手做印象对更深刻,那么我给大家看一个代码,看看代码中IOC容器的实现. 代码实现: 创建一个类库: 解决方案的类库建立: 创建一个实体类: ...

  6. 如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度

    当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行. Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且提供了强大 ...

  7. Spring源码分析——IOC容器

    1.IOC容器的概念 理解IOC容器的概念之前首先需要了解依赖翻转(又称依赖倒置)的概念 许多复杂的应用都是通过多个类之间的彼此合作实现业务逻辑的,这使得每个对象都需要管理自己与其合作对象的依赖,而如 ...

  8. Spring的IOC创建对象的方式和代码基本解释为什么要有ioc的思维以及Ioc容器和spring依赖注入的解释

    首先我们要知道 Ioc是个啥? ​ IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序.传统应用程序都是由我们在类内部主动创建依赖对象,从而导致 ...

  9. IoC容器Autofac(2) - 一个简单示例(附demo源码)

    上篇文章中(IoC容器Autofac(1) -- 什么是IoC以及理解为什么要使用Ioc),我们用自己的方式实现了一个简陋的工厂类来实现IoC. 这里我们尝试使用Auotfac来替换我们的工厂类Mov ...

最新文章

  1. 数据分析之Pandas合并操作总结
  2. 面试02.01移除重复结点
  3. js:进一步关闭(范围:下一个)
  4. UNITY Profiler 真机调试
  5. [ An Ac a Day ^_^ ] CodeForces 468A 24 Game 构造
  6. 【Python入门】Python字符串的45个方法详解
  7. 经典html5网页,HTML5网页设计经典
  8. 《最后生还者:第二部》文学批评
  9. cad放大_dwg文件怎么打开?CAD看图,360°精确识别CAD图块,细节见真章
  10. 歌词服务器文件名,lrc是什么格式,MP3的LRC格式歌词同步方法
  11. 软件工程--总体设计过程包括那些步骤---软件设计过程中应该遵循那些基本原理--模块独立性
  12. S5P4418裸机开发(一):相关工具准备
  13. C语言中文网学习进度
  14. QDialog无边框
  15. 别害怕,C++容器的迭代器其实好用又不难
  16. 真实经历!运维安全工程师经典面试汇总
  17. python金融应用的好书推荐卡_十大金融好书推荐
  18. javascript 实现blob加密视频(html video),服务端为php
  19. 读取excel中的表格数据到字典dict中--python
  20. FlowNet2.0 win10系统疑难问题解决

热门文章

  1. PowerDesigner新建模板
  2. Execute .NET Code under SQL Server 2005
  3. Java并发编程中volatile实现过程详细解析
  4. 【20181026T2】**图【最小瓶颈路+非旋Treap+启发式合并】
  5. 怎样用原生js配合css的transition写个无缝滚动
  6. 无人职守安装的设计与部署
  7. 12款白帽子用于黑客渗透测试的操作系统
  8. swf 文件在线播放的,怎么能够下载呢?(除视频外其它都可)
  9. 利用两款软件实现图片转文字
  10. redis缓存设计要点随谈