目录:

一、简介

二、如何使用

  2.1、基本使用

  2.2、接口使用

  2.3、 其他注入

  2.4、 注入的生命周期


一、简介

在上一篇文章中讲到替换默认服务容器,我们选择了Autofac

Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高。

我们在.Net Core 中替换了自带的默认服务容器,选择采用Autofac,那么如何去使用它呢?

二、如何使用

TestController控制器

  1. public class TestController : Controller
  2. {
  3. private static Animals _animals;
  4.  
  5. public IActionResult Index()
  6. {
  7. ViewBag.Animal = _animals.Cry();
  8. return View();
  9. }
  10. }

替换修改后的Startup.cs 中的ConfigureServices

  1. public IServiceProvider ConfigureServices (IServiceCollection services)
  2. {
  3. services.AddMvc();
  4. // Add other framework services
  5. // Add Autofac
  6.  
  7. var containerBuilder = new ContainerBuilder();
  8.  
  9. containerBuilder.Populate(services);
  10. var container = containerBuilder.Build();
  11. return new AutofacServiceProvider(container);
  12.  
  13. }

1.1、  基本使用

创建 Animals  类

  1. public class Animals
  2. {
  3. public string Cry()
  4. {
  5. return "小狗,汪汪汪";
  6. }
  7. }

ConfigureServices   中添加注册

  1. containerBuilder.RegisterType<Animals>();

TestController 控制器中添加构造函数

  1. public TestController(Animals animals)
  2. {
  3. _animals = animals;
  4.  
  5. }

运行起来看下

1.2、  接口使用

创建IAnimals.cs

  1. public interface IAnimals
  2. {
  3. string Cry();
  4. }
  5.  
  6. public class DogCry : IAnimals
  7. {
  8. public string Cry()
  9. {
  10. return "小狗,汪汪汪";
  11. }
  12. }
  13. public class CatCry : IAnimals
  14. {
  15. public string Cry()
  16. {
  17. return "小猫,喵喵喵";
  18. }
  19. }

ConfigureServices   中添加注册

  1. containerBuilder.RegisterType<DogCry>().As<IAnimals>();

TestController 控制器中添加构造函数并修改_animals为对应的类型

  1. public TestController(IAnimals animals)
  2. {
  3. _animals = animals;
  4. }

运行起来

如果一个类型被多次注册,以最后一个注册的为准

ConfigureServices   中添加注册

  1. containerBuilder.RegisterType<DogCry>().As<IAnimals>();
  2.  
  3. containerBuilder.RegisterType<CatCry>().As<IAnimals>();

运行起来看下

1.3、  其他注入

1、 自动装配—从容器里面选择一个构造方法来创建对象

创建Cry类

  1. public class Cry
  2. {
  3.  
  4. public Cry()
  5. {
  6. voice= "小狗,汪汪汪";
  7. }
  8.  
  9. public Cry(string voices)
  10. {
  11. if (string.IsNullOrWhiteSpace(voices))
  12. {
  13. voice = "旺旺旺";
  14.  
  15. }
  16. voice= $"小狗,{voices}";
  17.  
  18. }
  19.  
  20. public Cry(string name, string voices):this(voices)
  21. {
  22. if (string.IsNullOrWhiteSpace(voices))
  23. {
  24. voice = "旺旺旺";
  25. }
  26. if (string.IsNullOrWhiteSpace(name))
  27. {
  28. voice = "柴犬";
  29. }
  30. voice= $"{name},{voices}";
  31. }
  32. public static string voice { get; set; }
  33. }

ConfigureServices   中添加注册

  1. containerBuilder.RegisterType<Cry>().UsingConstructor(typeof(string));

Autofac会默认从容器中选择参数最多的构造函数,如果想要指定选择的话可以指定UsingConstructor

2、 实例化注入

还是上面的Cry类

ConfigureServices   中添加注册

  1. var output = new Cry("叫声叫声");
  2.  
  3. containerBuilder.RegisterInstance(output).ExternallyOwned();

先对对象实例化然后注册,ExternallyOwned--配置组件,使容器永远不会处理实例。

修改Test控制器

  1. public IActionResult Index()
  2. {
  3. ViewBag.Animal = Cry.voice;
  4.  
  5. return View();
  6. }

1.4、  注入的生命周期

1 Transient暂时生存期)--暂时生存期服务是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。

2 Scoped范围生存期)--范围生存期服务是每个客户端请求连接时创建的一次实例

3 Singleton单例生存期)--单例生存期会在程序第一次请求是创建一次实例,不会变化的

我们来利用生成guid来看一下三个的生命周期有什么具体的不一样

修改Test控制器

  1. public class TestController : Controller
  2. {
  3.  
  4. private static IGetTransient _getTransient;
  5.  
  6. private static IGetScoped _getScoped;
  7.  
  8. private static IGetSingleton _getSingleton;
  9.  
  10. public TestController(IGetTransient getTransient, IGetScoped getScoped, IGetSingleton getSingleton)
  11. {
  12. _getTransient = getTransient;
  13.  
  14. _getScoped = getScoped;
  15.  
  16. _getSingleton = getSingleton;
  17. }
  18.  
  19. public IActionResult Index()
  20. {
  21. ViewBag.getTransient = _getTransient.GuidItem();
  22.  
  23. ViewBag.getScoped = _getScoped.GuidItem();
  24.  
  25. ViewBag.getSingleton = _getSingleton.GuidItem();
  26.  
  27. return View();
  28. }
  29.  
  30. }

修改Index.cshtml

  1.   <div>
  2. <span>Transient:</span><span>@ViewBag.getTransient</span>
  3. </div>
  4.  
  5. <div>
  6. <span>Scoped:</span><span>@ViewBag.getScoped</span>
  7. </div>
  8.  
  9. <div>
  10. <span>Singleton:</span><span>@ViewBag.getSingleton</span>
  11. </div>

IGuid接口

  1.    public interface IGuid
  2. {
  3. Guid GuidItem();
  4. }
  5.  
  6. /// <summary>
  7. /// 暂存生存期
  8. /// </summary>
  9. public interface IGetTransient : IGuid
  10. {
  11.  
  12. }
  13.  
  14. /// <summary>
  15. /// 范围生存期
  16. /// </summary>
  17. public interface IGetScoped : IGuid
  18. {
  19.  
  20. }
  21.  
  22. /// <summary>
  23. /// 单例生存期
  24. /// </summary>
  25. public interface IGetSingleton : IGuid
  26. {
  27.  
  28. }

GuidServiceBase

  1. public class GuidServiceBase: IGuid
  2. {
  3. private readonly Guid _item;
  4.  
  5. public GuidServiceBase()
  6. {
  7. _item = Guid.NewGuid();
  8. }
  9.  
  10. public Guid GuidItem()
  11. {
  12.  
  13. return _item;
  14. }
  15. }
  16. /// <summary>
  17. /// 暂存生存期
  18. /// </summary>
  19. public class GuidTransientService : GuidServiceBase, IGetTransient
  20. {
  21. }
  22.  
  23. /// <summary>
  24. /// 范围生存期
  25. /// </summary>
  26. public class GuidScopedService : GuidServiceBase, IGetScoped
  27. {
  28. }
  29.  
  30. /// <summary>
  31. /// 单例生存期
  32. /// </summary>
  33. public class GuidSingletonService : GuidServiceBase, IGetSingleton
  34. {
  35. }

ConfigureServices   中添加注册

  1. containerBuilder.RegisterType<GuidTransientService>().As<IGetTransient>();
  2.  
  3. containerBuilder.RegisterType<GuidScopedService>().As<IGetScoped>().InstancePerLifetimeScope();

  4. containerBuilder.RegisterType<GuidSingletonService>().As<IGetSingleton>().SingleInstance();

运行起来发现Singleton单例生存期)没有变化,仅产生了一个实例,但是Scoped范围生存期) 变化的不一样,按照理论来说应该刷新之后会变化,但是两边应该会是一样的值。--(因为两个页面依然是独立的,并不是一次请求)。我们换另一种方式验证这个

修改Test控制器新增Guid

  1. public IActionResult Guid()
  2. {
  3. return View();
  4. }

添加Guid.cshtml通过inject注入依赖

  1. @{
  2. Layout = null;
  3. }
  4. @inject WebApplication3.IGetTransient TransientService
  5. @inject WebApplication3.IGetScoped GuidScopedService
  6. @inject WebApplication3.IGetSingleton GuidSingletonService
  7. <!DOCTYPE html>
  8. <html>
  9. <head>
  10. <meta name="viewport" content="width=device-width" />
  11. <title>Guid</title>
  12. </head>
  13. <body>
  14. <div class="row">
  15. <div>
  16. <h2>GuidItem Shows</h2>
  17. <h3>TransientItem: @TransientService.GuidItem()</h3>
  18.  
  19. <h3>ScopedItem: @GuidScopedService.GuidItem()</h3>
  20.  
  21. <h3>SingletonItem: @GuidSingletonService.GuidItem()</h3>
  22.  
  23. </div>
  24. </div>
  25. </body>
  26. </html>

修改Index.cshtml

  1. @{
  2. ViewData["Title"] = "Index";
  3. }
  4.  
  5. <h1>Index</h1>
  6.  
  7. @Html.Partial("Guid")
  8.  
  9. <h1>Guid</h1>
  10.  
  11. @Html.Partial("Guid")

运行然后打开两个页面

我们再次完全吻合的,暂时生命周期在每次使用的时候的Guid(实例)都是变化的,范围生命周期在同一个请求范围内Guid是不变化的,不同请求的Guid是会发生变化的。但是单例生命周期的Guid从程序开始就不会发生变化的。


  欢迎大家扫描下方二维码,和我一起学习更多的知识

依赖注入容器-- Autofac的更多相关文章

  1. 依赖注入容器Autofac的详解

    Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Aut ...

  2. 依赖注入容器Autofac与MVC集成

    Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近.契合C#语言的特点.随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关 ...

  3. 深入浅出依赖注入容器——Autofac

    1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...

  4. Autofac依赖注入容器

    依赖注入容器-- Autofac https://github.com/danielpalme/IocPerformance Unity 更新频率高,微软的项目Grace 综合性能更高 目录: 一.简 ...

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

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

  6. 依赖注入之Autofac使用总结

    依赖倒置?控制反转(IOC)? 依赖注入(DI)? 你是否还在被这些名词所困扰,是否看了大量理论文章后还是一知半解了? 今天我想结合实际项目,和正在迷惑中的新手朋友一起来学习和总结依赖注入Autofa ...

  7. webapi框架搭建-依赖注入之autofac

    前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...

  8. 大比速:remoting、WCF(http)、WCF(tcp)、WCF(RESTful)、asp.net core(RESTful) .net core 控制台程序使用依赖注入(Autofac)

    大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ...

  9. 依赖注入(二)Autofac简单使用

    Autofac简单使用 源码下载传上源码,终于学会传文件了. 首先 还是那句话:“不要信我,否则你死得很惨!”. C#常见的依赖注入容器 IoC in .NET part 1: Autofac IoC ...

随机推荐

  1. VueJs(11)---vue-router(进阶2)

    vue-router(进阶2) 上篇文章讲了第一篇vue-router相关文章,文章地址:VueJs(10)---vue-router(进阶1) 一.命名路由 有时候,通过一个名称来标识一个路由显得更 ...

  2. java float double精度为什么会丢失?浅谈java的浮点数精度问题 【转】

    由于对float或double 的使用不当,可能会出现精度丢失的问题.问题大概情况可以通过如下代码理解: public class FloatDoubleTest { public static vo ...

  3. mysql数据库的安装步骤

    Redhat6.5 1.准备工作 卸载使用rpm包安装的mysql-server.mysql软件包 安装自带的ncurses-devel包 rpm -ivh /mnt/Packages/ncurses ...

  4. 一文读懂阻塞、非阻塞、同步、异步IO

    介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...

  5. 利用css实现hover动态效果

    .font em:hover { font-size: 2em } .font strong:hover { font-weight: normal } .font span:hover { colo ...

  6. Runc 简介

    RunC 是什么? RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好.我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器.事实上,r ...

  7. Django 项目创建之前的环境搭建

    安装虚拟管理环境 sudo apt install virtualenv 在项目中运行 virtualenv fruitenv 进入到环境中 source fruitenv/bin/activate ...

  8. ubuntu宽带连接

    1.打开终端:    输入:sudo pppoeconf    根据提示输入宽带用户名和密码,若提示Plugin rp-pppoe.so loaded.则已连接成功.2.手动开启/断开连接:    p ...

  9. .net如何使用系统中没有安装的字体?

    不想安装到客户端的 Fonts 目录下面,但是我又想在程序中使用它. 这段代码放在哪里? 字体文件需要放到要安装的机器上吗?并不需要 System.Drawing.Text.PrivateFontCo ...

  10. html5中让页面缩放的4种方法

    1.viewport 这种方法,不是所有的浏览器都兼容<meta name="viewport" content="width=640,minimum-scale= ...