.NET Core下自带容器IServiceCollection以及AutoFac以及AutoFac中AOP简介

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;
     }

}

原文地址:https://www.cnblogs.com/taotaozhuanyong/p/11562184.html

时间: 2024-08-25 12:26:32

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

CentOS7下使用Docker容器化.net Core 2.2

原文:CentOS7下使用Docker容器化.net Core 2.2 一.使用 yum 安装(CentOS 7下) Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname -r 命令查看你当前的内核版本 二.安装 Docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE. Docker CE 即社区免费版,Dock

Asp.Net Core下使用swagger生成api文档

目录 一.前期准备 二.配置Swagger 三.参考 .Net Core中有两个集成NSwag的包,分别为Swashbuckle和NSwag.两者的配置大同小异.这里以NSwag为例. 一.前期准备 1.初始化asp.net core 测试项目 新建asp.net core项目,此处略过: 新建apicontroller,并编写测试代码: [Route("api/[controller]")] [ApiController] public class UserApiController

Net Core下通过Proxy 模式

Net Core下通过Proxy 模式 NET Core下的WCF客户端也是开源的,这次发布.NET Core 2.0,同时也发布了 WCF for .NET Core 2.0.0, 本文介绍在.NET Core下如何通过Proxy 消费WCF服务. 我们现在直接可以在 standard 2.0下调用wcf服务了,不过 Microsoft WCF Web Service Reference Provider 目前是beta阶段,要使用这个插件,需要安装一个Visual Studio插件,下载地址

.net core下直接执行SQL语句并生成DataTable

.net core可以执行SQL语句,但是只能生成强类型的返回结果.例如var blogs = context.Blogs.FromSql("SELECT * FROM dbo.Blogs").ToList().而不允许返回DataSet.DataTable等弱类型.可能由于这个原因没有实现在.net core中DataTable,然而DataTable还是可能会用到的.我们这里就有一个数据仓库的需求,允许用户自行编写类似SQL语句,然后执行,以表格展示.因为语句是千变万化的,因此我也

.Net Core下使用WCF

在.net core 下的wcf 和framework下的wcf使用方式有点不太一样.在core下用wc,需要安装VS扩展Visual Studio WCF Connected Service,目前这个插件不是特别的稳定,经常会出现莫名其妙的错误,前段时间最高支持到.net standard 1.6,可是我用的是.net core 2.0 于是,在同事的提醒下,我先将 .net standard 降为1.6 调用完wcf服务后,再升级为2.0.不会出现任何错误.最近好了,升级到2.0了,直接可以

Net Core下通过Proxy 模式 使用 WCF

.NET Core下的WCF客户端也是开源的,这次发布.NET Core 2.0,同时也发布了 WCF for .NET Core 2.0.0, 本文介绍在.NET Core下如何通过Proxy 消费WCF服务. 我们现在直接可以在 standard 2.0下调用wcf服务了,不过 Microsoft WCF Web Service Reference Provider 目前是beta阶段,要使用这个插件,需要安装一个Visual Studio插件,下载地址: https://marketpla

c# .net core 下的网络请求

本文章是在VS2017的环境下,.net core 1.1版本以上. 在这期间,由于.net core 并不基于IIS,我们的过去的网络请求代码在.net core框架下,有可能会出现不兼容,报错的现象.这里大致介绍下在.net core 下如何进行http请求,主要仍然是GET和POST方法,有错误的地方,欢迎指正! 先来说POST,POST我实现了三种方法,前两种基于的原理是完全一致的,后面的有些小小的差异,但他们的本质都是http请求,本质上是无区别的,只是实现方法有所不同. 废话不多说,

.NET Core下使用gRpc公开服务(SSL/TLS)

一.前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息,而随之而来的就是一波关于.NET Core下如何使用的教程,但是在这众多的教程中基本都是泛泛而谈,难以实际在实际环境中使用,而该篇教程以gRpc为主,但是使用了其SSL/TLS,这样更加符合实际的生产使用,期间也会配套的讲解Docker.openssl等. 二.服务端 a.准备工作 笔者的项目分为三个部分分别如下所示: Sino.GrpcService.Host(控制台):宿主程序 Sino.GrpcService.Impl(

.Net Core下如何管理配置文件(转载)

原文地址:http://www.cnblogs.com/yaozhenfa/p/5408009.html 一.前言 根据该issues来看,System.Configuration在.net core中已经不存在了,那么取而代之的是由Microsoft.Extensions.Cnfiguration.XXX一系列的类库提供,对应的开源地址为点击这里. 从当前开源的代码来看,在.net core下提供了以下类库给我们: Microsoft.Extensions.Configuration.Abst