打代码之前先说一下几个概念,那就是什么是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容器的使用的更多相关文章

  1. Spring 中 IoC 容器简介

    IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架 在一个系统中可以生成各种对象,并且这些对象都需要进行管理.为了描述这些对象关系,我们需要一个容 ...

  2. 浅谈ASP.NET Core中IOC与DI的理解和使用

    说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但是一直觉得有点很难去理解,总觉得对其还是模糊不清,所以,趁着今天有空,就去把两个概念 ...

  3. spring中IOC容器注册和获取bean的实例

    spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结 1.使用xml文件配置 在idea中创建maven工程,然后创建实例Person,然后在 ...

  4. ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)

    IOC的一个重点是在程序运行中,动态的向某个对象提供它所需要的其他对象.这一点是通过DI来实现的.Autofac则是比较流行的一款IOC容器. IoC和DI有什么关系呢?其实它们是同一个概念的不同角度 ...

  5. Spring中Ioc容器的注入方式

    1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { ...

  6. 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

      转发时请注明原创作者及地址,否则追究责任.原创:alunchen 在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转. 三种对象生 ...

  7. ASP.NET Core 中文文档 第三章 原理(10)依赖注入

    原文:Dependency Injection 作者:Steve Smith 翻译:刘浩杨 校对:许登洋(Seay).高嵩 ASP.NET Core 的底层设计支持和使用依赖注入.ASP.NET Co ...

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

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

  9. 详解Spring IoC容器

    一.Spring IoC容器概述 1.依赖反转(依赖注入):依赖对象的获得被反转了. 如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的 ...

随机推荐

  1. WPF 添加提示动画

    下面放一张效果图: 那么具体是怎么实现呢: 前端XAML中: <Image Source="/Images/tips.png" HorizontalAlignment=&qu ...

  2. CentOS6.5源码安装mysql-5.5.21

    本文参考自 http://www.cnblogs.com/ShanFish/p/6531365.html,但不局限于它. 一. 卸载旧版本 .检查是否安装mysql组件 # rpm -qa | gre ...

  3. vue状态管理vuex从浅入深详细讲解

    1.vuex简介以及创建一个简单的仓库 vuex是专门为vue框架而设计出的一个公共数据管理框架,任何组件都可以通过状态管理仓库数据沟通,也可以统一从仓库获取数据,在比较大型的应用中,数据交互庞大的情 ...

  4. three.js中的事件

    以上一篇入门篇为例来简单的设置下3d模型当中的交互事件,上一篇我们已经完成了在3d页面中添加了一个红色球,下面我们给这个球一个点击事件让它Y轴位置上升,再设置一个鼠标移入到球上时让其变色. 1.其实t ...

  5. 到头来还是逃不开Java - Java13程序基础

    java程序基础 没有特殊说明,我的所有学习笔记都是从廖老师那里摘抄过来的,侵删 引言 兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来. ...

  6. # 团队项目-Beta冲刺2(七个小矮人)

    团队项目-Beta冲刺2(七个小矮人) 一.格式描述 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScien ...

  7. 《即时消息技术剖析与实战》学习笔记9——IM系统如何支持消息的多终端漫游

    一.什么是多终端漫游 多终端漫游是指:用户在任意一个设备登录后,都能获取到历史的聊天记录.如:QQ 默认漫游 7 天的聊天记录,开通 VIP 会员可漫游 30 天,开通 SVIP 会员可漫游 2 年. ...

  8. QDialog

    QDialog设置setWindowFlags(Qt::FramelessWindowHint);后,dialog弹不出来,界面不显示: 在继承一个QDialog类并设置窗口为无边框时,如果调用set ...

  9. 内网IP的解释

    https://baike.baidu.com/item/%E5%86%85%E7%BD%91ip/8881186?fr=aladdin

  10. ThreadLocal梳理

    ThreadLocal ThreadLocal提供了线程独有的局部变量,可以在整个线程存活的过程中随时取用,极大地方便了一些逻辑的实现. 当使用ThreadLocal维护变量时,ThreadLocal ...