.Net Core中IOC容器的使用
打代码之前先说一下几个概念,那就是什么是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中以构造函数注入的方式进行调用
水平有限,但是希望能帮到大家。
END
.Net Core中IOC容器的使用的更多相关文章
- Spring 中 IoC 容器简介
IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架 在一个系统中可以生成各种对象,并且这些对象都需要进行管理.为了描述这些对象关系,我们需要一个容 ...
- 浅谈ASP.NET Core中IOC与DI的理解和使用
说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但是一直觉得有点很难去理解,总觉得对其还是模糊不清,所以,趁着今天有空,就去把两个概念 ...
- spring中IOC容器注册和获取bean的实例
spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结 1.使用xml文件配置 在idea中创建maven工程,然后创建实例Person,然后在 ...
- ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)
IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...
- Spring中Ioc容器的注入方式
1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { ...
- 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC
转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...
- ASP.NET Core 中文文档 第三章 原理(10)依赖注入
原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...
- 反射 + 配置文件 实现IOC容器
IOC实现: IOC容器我们只停留在知道上是不行的,我们要动手做印象对更深刻,那么我给大家看一个代码.看看代码中IOC容器的实现. 代码实现: 创建一个类库: 解决方式的类库建立: 创建一个实体类:U ...
- 详解Spring IoC容器
一.Spring IoC容器概述 1.依赖反转(依赖注入):依赖对象的获得被反转了. 如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的 ...
随机推荐
- 菜鸟学习Fabric源码学习 — 背书节点和链码容器交互
Fabric 1.4 源码分析 背书节点和链码容器交互 本文档主要介绍背书节点和链码容器交互流程,在Endorser背书节点章节中,无论是deploy.upgrade或者调用链码,最后都会调用Chai ...
- schedule of 2016-10-09~2016-10-16(Sunday~Sunday)——1st semester of 2nd Grade
most important things to do 1.prepare for toefl 2.joint phd preparations 3.ieee trans thesis to writ ...
- Match3 Module For Game(THDN)
介绍 THDN的核心机制为Match3的利用,本文对Match3 Gameplay进行记录,并对其进行改良.THDN作为RogueLIke性质的游戏,玩家在随机生成的dungeon里进行探索并获 ...
- ORM基础4 跨表查询+原子性操作
一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...
- python函数和lambda表达式学习笔记
1. python函数 不同于其他语言,python支持函数返回多个值 为函数提供说明文档:help(函数名)或者函数名.__doc__ def str_max(str1, str2): ''' 比较 ...
- 使用Razor 使用Razor表达式处理命名空间 精通ASP-NET-MVC-5-弗瑞曼
- Dynamics 365 CRM Connected Field Service 不能接收IoT Alert
今天浪费了2,3个小时再connected field service(CFS)上面. 状况如下 1. 在CFS中添加了新的customer assets,并且点击了注册按钮. 2. 注册步骤一直在i ...
- SpringDataRedis入门到实战
1.项目常见问题思考 对于电商系统的广告后台管理和广告前台展示,首页每天有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪.那如何解决呢?我们通常的做法有两种:一种是数据缓存.一种是网页静态化.我 ...
- 字符串(String)的创建,以及字符串的属性及方法
1.String对象的创建 方法1: var txt = new String("i am String"); console.log(txt); // 结果为:i am Stri ...
- Web自动化测试项目(五)测试结果通知
一.邮件通知 使用第三方邮件发送库yagmail github地址:https://github.com/kootenpv/yagmail 安装 pip3 install yagmail demo.p ...