https://www.cnblogs.com/artech/p/net-core-di-01.html 大内老A的在.NET Core下对这些的介绍,有一系列文章

https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html

https://www.cnblogs.com/artech/p/dependency-injection-in-asp-net-core.html

https://www.zybuluo.com/dasajia2lang/note/1481011

下面开始

在上一篇的笔记中,在.NET Freamwork中,有一个第三方容器Unity,可以实现注入,但是在.NET Core里面,有一个IServiceCollection,这个是.NET Core框架自带的一个容器,和Unity很相似,都是个容器。

下面我们新建一个控制台程序,在控制台程序中,对IServiceCollection的使用做介绍。

下面代码,是本次实例中需要注入的类型,需要用的倒是再点开来看吧

namespace Bingle.Core.Interface
{
public interface ITestServiceA
{
void Show();
}
}
namespace Bingle.Core.Service
{
public class TestServiceA : ITestServiceA
{
public void Show()
{
Console.WriteLine("A123456");
}
}
} namespace Bingle.Core.Interface
{
public interface ITestServiceB
{
void Show();
}
} namespace Bingle.Core.Service
{
public class TestServiceB : ITestServiceB
{ public TestServiceB(ITestServiceA iTestService)
{ } public void Show()
{
Console.WriteLine($"This is TestServiceB B123456");
}
}
} namespace Bingle.Core.Interface
{
public interface ITestServiceC
{
void Show();
}
} namespace Bingle.Core.Service
{
public class TestServiceC : ITestServiceC
{
public TestServiceC(ITestServiceB iTestServiceB)
{
}
public void Show()
{
Console.WriteLine("C123456");
}
}
} namespace Bingle.Core.Interface
{
public interface ITestServiceD
{
void Show();
}
} namespace Bingle.Core.Service
{
public class TestServiceD : ITestServiceD
{
public void Show()
{
Console.WriteLine("D123456");
}
}
}

需要通过Nuget包,把IServiceCollection依赖的dll文件进入进来

Microsoft.Extensions.DependencyInjection

使用容器的三部曲:实例化一个容器、注册、获取服务

 IServiceCollection container = new ServiceCollection();
// IServiceCollection
container.AddTransient<ITestServiceA, TestServiceA>(); // 瞬时生命周期 每一次获取的对象都是新的对象
container.AddSingleton<ITestServiceB, TestServiceB>(); // 单例生命周期 在容器中永远只有当前这一个
container.AddScoped<ITestServiceC, TestServiceC>(); //当前请求作用域内 只有当前这个实例 container.AddSingleton<ITestServiceD>(new TestServiceD()); // 也是单例生命周期 ServiceProvider provider = container.BuildServiceProvider(); ITestServiceA testA = provider.GetService<ITestServiceA>();
ITestServiceA testA1 = provider.GetService<ITestServiceA>();
Console.WriteLine(object.ReferenceEquals(testA, testA1)); ITestServiceB testB = provider.GetService<ITestServiceB>();
ITestServiceB testB1 = provider.GetService<ITestServiceB>();
Console.WriteLine(object.ReferenceEquals(testB, testB1)); ITestServiceC testC = provider.GetService<ITestServiceC>();
ITestServiceC testC1 = provider.GetService<ITestServiceC>();
Console.WriteLine(object.ReferenceEquals(testC, testC1)); IServiceScope scope = provider.CreateScope();
ITestServiceC testc3 = provider.GetService<ITestServiceC>();
var testc4 = scope.ServiceProvider.GetService<ITestServiceC>();
Console.WriteLine(object.ReferenceEquals(testc3, testc4)); ITestServiceD testD = provider.GetService<ITestServiceD>();
ITestServiceD testD1 = provider.GetService<ITestServiceD>();
Console.WriteLine(object.ReferenceEquals(testD, testD1));

AutoFac也是个容器,下面在Core中把AutoFac整合进来。

1、在Nuget中添加AutoFac

2、ConfigureService需要一个返回值,IServiceProvider(在.NET Core3.0中不需要替换)

3、实例化一个容器:

ContainerBuilder containerbuilder = new ContainerBuilder();

4、注册服务,自定义一个类型,继承Module,并重写Load方法:

public class CustomAutofacModule:Module
{
/// <summary>
/// 当前这Module 专用做服务注册
/// </summary>
/// <param name="builder"></param>
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<TestServiceA>().As<ITestServiceA>().SingleInstance();
builder.RegisterType<TestServiceB>().As<ITestServiceB>().SingleInstance();
builder.RegisterType<TestServiceC>().As<ITestServiceC>().SingleInstance();
builder.RegisterType<TestServiceD>().As<ITestServiceD>().SingleInstance();
}
}

在Startup.cs中的ConfigureServices()方法中加上一下代码:

// services 默认的注册服务,还需要处理控制器实例相关的的工作。
containerbuilder.Populate(services); // autofac 全权接管了之前这个Service的所有工作 containerbuilder.RegisterModule<CustomAutofacModule>();
IContainer container = containerbuilder.Build();
return new AutofacServiceProvider(container);

AutoFac支持AOP

AOP存在的意义,是在这个方法执行之前做什么事,做完这个方法之后,又做什么事。

1、安装nuget包,DynamicProxy

2、自定义一个类,继承IInterceptor接口

 public class CustomAutofacAOP : IInterceptor
{
public void Intercept(IInvocation invocation)
{
Console.WriteLine($"method is {invocation.Method.Name}");
Console.WriteLine($"Arguments is {string.Join(';', invocation.Arguments)}"); invocation.Proceed();// 这里表示继续执行,就去执行之前应该执行的动作了 Console.WriteLine("**************"); }
}

在之前的CustomAutofacModule也要稍作修改:

添加两个测试类:

 public interface IA
{
void Show();
} [Intercept(typeof(CustomAutofacAOP))]
public class A : IA
{
public void Show()
{
Console.WriteLine("Cm");
}
}

在一个控制器下,通过构造函数的方式来实现注入:

 public class BingleController : Controller
{
private ILoggerFactory _factory = null;
private ILogger<SecondController> _ilogger = null; private ITestServiceA _testServiceA = null;
private ITestServiceB _testServiceB = null;
private ITestServiceC _testServiceC = null;
private ITestServiceD _testServiceD = null;
private IA _a = null; public BingleController(ILoggerFactory factory, ILogger<SecondController> ilogger,
ITestServiceA testServiceA,
ITestServiceB testServiceB,
ITestServiceC testServiceC,
ITestServiceD testServiceD,
IA a)
{
_factory = factory;
_ilogger = ilogger;
_testServiceA = testServiceA;
_testServiceB = testServiceB;
_testServiceC = testServiceC;
_testServiceD = testServiceD;
_a = a;
} }

.NET Core下自带容器IServiceCollection以及AutoFac以及AutoFac中AOP简介的更多相关文章

  1. Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它

    Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...

  2. net core体系-web应用程序-4net core2.0大白话带你入门-8asp.net core 内置DI容器(DependencyInjection,控制翻转)的一点小理解

    asp.net core 内置DI容器的一点小理解   DI容器本质上是一个工厂,负责提供向它请求的类型的实例. .net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IO ...

  3. 解析 .Net Core 注入 (2) 创建容器

    在上一节的学习中,我们已经知道了通过 IServiceCollection 拓展方法创建 IServiceProvider 默认的是一个类型为 ServiceProvider 对象,并且实际提供创建对 ...

  4. 在ASP.Net Core下,Autofac实现自动注入

    之前使用以来注入的时候,都是在xml配置对应的接口和实现类,经常会出现忘了写配置,导致注入不生效,会报错,而且项目中使用的是SPA的模式,ajax报错也不容易看出问题,经常会去排查日志找问题. 于是在 ...

  5. SeaweedFS在.net core下的实践方案

    一直对分布式的文件储存系统很感兴趣,最开始关注淘宝的TFS(Taobao File System),好像搁浅了,官方地址无法访问,github上面,各种编译问题,无意间发现了SeaweedFS 链接s ...

  6. 一个.NET Core下的开源插件框架

    插件模式历史悠久,各种中大型软件基本上都会实现插件机制,以此支持功能扩展,从开发部署层面,插件机制也可实现功能解耦,对于并行开发.项目部署.功能定制等都有比较大的优势. 在.NET Core下,一般我 ...

  7. ASP.NET Core 3.1 IOC容器以及默认DI以及替换Autofac生命周期

    IOC 就是我们需要一个对象 以前我们是去 new 现在我们是直接向 IOC容器 要我们需要的那个对象. 使用一个IOC容器(autofac)通过依赖注入控制各个组件的耦合.也就是说你写好了组件,不需 ...

  8. .NET Core下的日志(1):记录日志信息

    记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断机制(相关A ...

  9. .net core系列之《.net core内置IOC容器ServiceCollection》

    一.IOC介绍 IOC:全名(Inversion of Control)-控制反转 IOC意味着我们将对象的创建控制权交给了外部容器,我们不管它是如何创建的,我们只需要知道,当我们想要某个实例时,我们 ...

随机推荐

  1. Selenium(十七):unittest单元测试框架(三) 脚本分析、编写Web用例

    1. 带unittest的脚本分析 也许你现在心里还有疑问,unittest框架与我们前面所编写的Web自动化测试之间有什么必然联系吗?当然有,既然unittest可以组织.运行测试用例,那么为什么不 ...

  2. IO相关Demo

    这几天复习了IO相关知识 只为记录,好记性不如烂笔头 有误请指正 ありがとうございます. 我的公众号 作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.判断存在,存在改名,并延迟删除,不存在新建 ...

  3. WM消息大全,windows消息大全

    WM消息大全 消息名 消息值 说明 WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SIZ ...

  4. json对象中的变量存在空格的取值办法

    写一个json对象,但需求需要是带空格的键,定义的话很容易定义,只需要双引号引起来即可,但取值的时候怎么取,直接写 会报错,所以就有了下边的办法 <el-form-item label=&quo ...

  5. CSAPP 3 程序的机器级表示

    1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器.数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 -- 程序开发人员需要知道一个变 ...

  6. MySQL数据库:数据的概念

    基本定义 数据:是数据库总存储的基本对象 定义:描述客观事物的符号记录 种类:数字.文字.图形.图像.声音等 数据库:DB 存储数据的集合 数据库管理系统:DBMS 用户和操作系统之间的一层数据管理软 ...

  7. 实操《kubernetes网络权威指南》之veth pair

    https://book.douban.com/subject/34855927/ 作者: 杜军 出版社: 电子工业出版社出品方: 博文视点出版年: 2019-10页数: 348定价: 89ISBN: ...

  8. MongoDB学习笔记(二、MongoDB查询)

    目录: MongoDB数据类型 MongoDB新增语法 MongoDB查询语法 MongoDB查询选择器 MongoDB关联查询 MongoDB数据类型: MongoDB新增语法: 语法:db.col ...

  9. 第05组 Beta冲刺(1/4)

    第05组 Beta冲刺(1/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...

  10. [BZOJ1042]AOI2008]硬币购物

    题目描述 Description 硬币购物一共有4种硬币.面值分别为\(c_1\) ,\(c_2\) ,\(c_3\) ,\(c_4\) .某人去商店买东西,去了\(tot\) 次.每次带\(d_i\ ...