.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容器技术原理和使用

 

点击【在看】与好友一起分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qiankun 微前端_qiankun 微前端应用实践与部署(二)

下面是两种方案的简要描述。传统部署方式通过配置 nginx 端口到目录的转发。具体可查看上一篇文章特点需要对外开放子应用对应的端口&#xff0c;将编译好的应用文件放到对应的配置目录。docker 部署方式首先构建主应用与子应用的 docker 镜像&#xff0c;通过 docker run 或者…

在树莓派上使用 PowerShell 调用 Azure 上的 .NET Core API 获取疫情数据

点击上方蓝字关注“汪宇杰博客”导语最近因为疫情被关在家里&#xff0c;做了个无聊成就&#xff1a;我们将在树莓派上用 PowerShell 调用 Azure 上的一个 .NET Core 写的 API 来获取疫情数据。疫情数据API疫情数据来源于腾讯新闻的一个实时更新的页面&#xff0c;原始 API 地址…

gitlab 删除分支_初识gitlab工作流

git对我来说挺难理解的&#xff0c;平时遇到问题也是绕着走&#xff0c;倒也没啥大问题&#xff0c;但基于git软件的工作流却很重要&#xff0c;尤其对于一个组织来说。git工作流、github工作流、gitlab工作流都属于特性分支(feature branches)的类别&#xff0c;今天主要理解g…

.NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)

07 | 用Autofac增强容器能力&#xff1a;引入面向切面编程&#xff08;AOP&#xff09;的能力如何获取没有命名的服务呢&#xff1f;// 获取没有命名的服务&#xff0c;把 namd 去掉即可 var servicenamed this.AutofacContainer.Resolve<IMyService>(); servicenamed.S…

hdfs读写流程_一文读懂HDFS分布式存储框架分析

一文读懂HDFS分布式存储框架分析HDFS是一套基于区块链技术的个人的数据存储系统&#xff0c;利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务&#xff0c;将闲置的存储空间利用起来&#xff0c;服务于正处于爆发期的个人数据存储市场。HDFS属于什么结构体…

gRPC in ASP.NET Core 3.x - gRPC 简介(1)

gRPC的结构 在我们搭建gRPC通信系统之前&#xff0c;首先需要知道gRPC的结构组成。 首先&#xff0c;需要一个server&#xff08;服务器&#xff09;&#xff0c;它用来接收和处理请求&#xff0c;然后返回响应。 既然有server&#xff0c;那么肯定有client&#xff08;客户端&…

arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准

1.1.1方法简介1.1.1.1所有图件扫描后都必须经过扫描纠正&#xff0c;对扫描后的栅格图进行检查&#xff0c;以确保矢量化工作顺利进行。对影像的配准有很多方法&#xff0c;下面介绍一种常用方法。(1)打开 ArcMap&#xff0c;增加 Georeferncing 工具条。(2)把需要进行纠正的影…

使用ASP.NET Core构建RESTful API的技术指南

译者荐语&#xff1a;利用周末的时间&#xff0c;本人拜读了长沙.NET技术社区翻译的技术文章《微软RESTFul API指南》&#xff0c;打算按照步骤写一个完整的教程&#xff0c;后来无意中看到了这篇文章&#xff0c;与我要写的主题有不少相似之处&#xff0c;特意翻译下来。原文来…

查询ecshop网站代码排查方法_提升网站访问速度,提升网站访问速度,提升网站访问速度的个人经验分享...

一、前言网站打开慢这个问题&#xff0c;算是老生常谈了&#xff0c;在实际的生产的环境中&#xff0c;我们会经常遇到这样的问题。作为一个运维工程师&#xff0c;我们该从哪些角度去分析问题&#xff0c;判断问题&#xff0c;并最终解决问题。那么首先我会从几个方面分析这个…

dotnet 手工打一个 dotnet tool 包

现在依靠 dotnet 平台&#xff0c;可以方便分发工具&#xff0c;利用 NuGet 服务进行分发和使用工具。打一个 dotnet tool 包&#xff0c;可以将这个包上传到 NuGet 上&#xff0c;小伙伴通过和安装 NuGet 相同方式就可以将工具安装在本机上。本文将告诉大家如何手工打一个 dot…

漫谈Linux文档属性、拥有者、群组、权限

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

java foreach跳出本次循环_Java中提供三种常用的循环语句

开发工具与关键技术&#xff1a;MyEclipse 10,java作者&#xff1a;刘东标循环语句&#xff1a;满足一定条件的情况下反复执行一个操作。Java中提供三种常用的循环语句&#xff1a;1.while循环语句while先判断为真&#xff0c;再执行while循环语句&#xff0c;如果条件为假&…