IOC简介

IOC思想

把类当做组件或服务来看待,组件内一定要高内聚,组件之间一定要低耦合,既然要保持低耦合,那就一定不要轻易的去new什么对象。
那组件之间的交互怎么处理呢?那最好的方式就是把new的操作交给第三方的治理框架去做,
比如往大处说的“Dubbo”, Spring Cloud(服务注册,服务发现,服务自动下线,流量分配,熔断,降级),往小处说就是IOC容器

把类往大处想。

把治理框架往小处想。。

IOC能做到那些

1. 对接口和实现类实现了由原来的零散式管理到现在的集中化管理。 (集中化日志,集中化配置系统 etcd,zookeeper)

new

业务驱动 IOC
产品驱动

2. 对类之间,类接口之间的关联关系可以采用多种模式注入(构造器注入,属性注入)等等。

3. 对实现类的生命周期进行了统一管理,能够控制服务的创建,释放和监控。

4. 对类的依赖由编译时推迟到了运行时。

new

.NET Core中IOC

NUGet 包 Microsoft.Extensions.DependencyInjection

Microsoft.Extensions.DependencyInjection.Abstractions(扩展)

            //IOC容器
ServiceCollection services = new ServiceCollection();
//注册服务 每次调用都创建新的类
services.AddTransient<IUserCQRS, UserCQRS>(); ////注册服务 只new一次
//services.AddSingleton<IUserCQRS, UserCQRS>(); //在某个作用于中就是一个单利
services.AddScoped<IUserCommand, UserCommand>(); //服务提供者
var serviceProvider = services.BuildServiceProvider();
var userQCRSImp = serviceProvider.GetService<IUserCQRS>();
Console.WriteLine(userQCRSImp.GetUserName("lalala")); //创建作用域 usercommand1 usercommand2 同一个实例 usercommand4 usercommand3 同一个实例
var scope1 = serviceProvider.CreateScope();
var usercommand1= scope1.ServiceProvider.GetService<IUserCommand>();
var usercommand2 = scope1.ServiceProvider.GetService<IUserCommand>(); var scope2 = serviceProvider.CreateScope();
var usercommand3 = scope2.ServiceProvider.GetService<IUserCommand>();
var usercommand4 = scope2.ServiceProvider.GetService<IUserCommand>();
  • Transient: 每一次GetService都会创建一个新的实例
  • Scoped:  在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)(可以手动创建多个作用域)
  • Singleton :整个应用程序生命周期以内只创建一个实例
AOP介绍

AOP思想

我们知道AOP是面向切面编程,很好的解决了系统级的功能和业务功能的耦合问题。。。

.NETCore AOP实现

nuget包  AspectCore.Extensions.DependencyInjection    对应github地址:https://github.com/dotnetcore/AspectCore-Framework   源码中有帮助文档

他也是基于IOC容器的。

代码下载

代码下载

第三方的IOC容器都是继承了 public interface IServiceProviderFactory<TContainerBuilder>

.NET Core IOC AOP的更多相关文章

  1. Spring中三个重要概念 IOC AOP Bean

    Spring中三个重要概念 IOC AOP Bean 首先讲解一下Spring框架,以及为什么要使用Spring 框架? spring 是一个很好的容器框架, 是轻量级的IoC和AOP的容器框架,主要 ...

  2. 仿写一个简陋的 IOC/AOP 框架 mini-spring

    讲道理,感觉自己有点菜.Spring 源码看不懂,不想强行解释,等多积累些项目经验之后再看吧,但是 Spring 中的控制反转(IOC)和面向切面编程(AOP)思想很重要,为了更好的使用 Spring ...

  3. spring ioc aop 原理

    spring ioc aop 原理 spring ioc aop 的原理 spring的IoC容器是spring的核心,spring AOP是spring框架的重要组成部分. 在传统的程序设计中,当调 ...

  4. IOC AOP 设计模式

    IOC AOP 不是什么技术而是一种设计模式  学习 IOC AOP 其实是在学习一种思想. 1.IOC IOC其实是 将对象的创建和获取提取到外部.由外部IOC容器提供需要的组件. 看下面代码: p ...

  5. Spring Bean的生命周期、Spring MVC的工作流程、IOC,AOP

    1.Spring Bean的生命周期? (1)构造方法实例化bean. (2)构造方法设置对象属性. (3)是否实现aware接口,三种接口(BeanNameAware,BeanFactoryAwar ...

  6. [Asp.Net Core轻量级Aop解决方案]AspectCore Project 介绍

    AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...

  7. Castle.Windsor IOC/AOP的使用

    Castle最早在2003年诞生于Apache Avalon项目,目的是为了创建一个IOC(控制反转)框架.发展到现在已经有4个组件了,分别是ActiveRecord(ORM组件).Windsor(I ...

  8. asp.net core的AOP记录

    序曲:学习编程最好的方式就是敲代码,没有比这个更好的方法,哪怕你看了上百G的视频,都不如你自己敲几行代码更为有效.还有要记得敲完代码然后写一篇随笔来记录一下你所学所想. 什么叫AOP? AOP面向切面 ...

  9. spring(一)IOC & AOP

    参考文档: spring详解:http://www.cnblogs.com/ysocean/p/7466191.html(可以说非常详细了) aop源码详解:https://www.cnblogs.c ...

随机推荐

  1. vue日常学习(2)

    1.组件学习之内容分发 1.1 作用域插槽 父级 <div class="parent"> <child> <template scope=" ...

  2. video标签在浏览器不能使用的问题 ?

    之前video标签是可以用的,但是压缩之后在移动端可以用,在pc浏览器不可以用? 怎么解决? 这样的写法会报错  说是缺乏source  但是你加上source也没有用 <video src=& ...

  3. spaceclaim脚本(线生成面体)

    #新建一个列表,用来保存修剪曲线(PS:修建曲线的意思是开始点和结束点不在一起,圆就不属于修建曲线) #注意和Line,Circle类型等的区别 curves = List[ITrimmedCurve ...

  4. etcd安装

    etcd有三种集群化启动的配置方案,分别为静态配置启动.etcd自身服务发现.通过DNS进行服务发现,重点讲一下静态配置启动.根据启动环境,可以选择不同的配置方式.这也是新版etcd区别于旧版的一大特 ...

  5. 微信小程序带cookie的request请求代码封装(小程序使用session)

    微信小程序带cookie的request请求可,以使服务端知道是同一个客户端请求. session_id会不变,从而很好的使用服务端的session. 写一个工具函数,直接导入使用即可,接口同 wx. ...

  6. nrm -- 一键切换npm源

    0. 背景 先描述一下没有nrm时我们是怎样使用npm源的 查看npm源地址,终端中输入 npm config list 可以看到npm源 metrics-registry = "https ...

  7. 项目启动时警告 Establishing SSL connection without server's identity verification is not recommended

    项目启动时控制台提示警告: Tue May 14 23:16:10 CST 2019 WARN: Establishing SSL connection without server's identi ...

  8. Java里如何将一个字符串重复n次

    程序: import java.util.Collections; public class RepeatString { public static String getRepeatSpace(St ...

  9. Oracle 表结构、索引以及分区信息查询

    Oracle 表结构.索引以及分区信息查询 /* 获取表:*/ select table_name from user_tables; --当前用户的表 select table_name from ...

  10. 使用 ASP.NET Core 创建 Web API及链接sqlserver数据库

    创建 Web API https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-web-api?view=aspnetcore-3.0& ...