依赖注入容器-- Autofac
目录:
一、简介
二、如何使用
2.1、基本使用
2.2、接口使用
2.3、 其他注入
2.4、 注入的生命周期
一、简介
在上一篇文章中讲到替换默认服务容器,我们选择了Autofac
Autofac---Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高。
我们在.Net Core 中替换了自带的默认服务容器,选择采用Autofac,那么如何去使用它呢?
二、如何使用
TestController控制器
- public class TestController : Controller
- {
- private static Animals _animals;
- public IActionResult Index()
- {
- ViewBag.Animal = _animals.Cry();
- return View();
- }
- }
替换修改后的Startup.cs 中的ConfigureServices
- public IServiceProvider ConfigureServices (IServiceCollection services)
- {
- services.AddMvc();
- // Add other framework services
- // Add Autofac
- var containerBuilder = new ContainerBuilder();
- containerBuilder.Populate(services);
- var container = containerBuilder.Build();
- return new AutofacServiceProvider(container);
- }
1.1、 基本使用
创建 Animals 类
- public class Animals
- {
- public string Cry()
- {
- return "小狗,汪汪汪";
- }
- }
ConfigureServices 中添加注册
- containerBuilder.RegisterType<Animals>();
TestController 控制器中添加构造函数
- public TestController(Animals animals)
- {
- _animals = animals;
- }
运行起来看下
1.2、 接口使用
创建IAnimals.cs
- public interface IAnimals
- {
- string Cry();
- }
- public class DogCry : IAnimals
- {
- public string Cry()
- {
- return "小狗,汪汪汪";
- }
- }
- public class CatCry : IAnimals
- {
- public string Cry()
- {
- return "小猫,喵喵喵";
- }
- }
ConfigureServices 中添加注册
- containerBuilder.RegisterType<DogCry>().As<IAnimals>();
TestController 控制器中添加构造函数并修改_animals为对应的类型
- public TestController(IAnimals animals)
- {
- _animals = animals;
- }
运行起来
如果一个类型被多次注册,以最后一个注册的为准
ConfigureServices 中添加注册
- containerBuilder.RegisterType<DogCry>().As<IAnimals>();
- containerBuilder.RegisterType<CatCry>().As<IAnimals>();
运行起来看下
1.3、 其他注入
1、 自动装配—从容器里面选择一个构造方法来创建对象
创建Cry类
- public class Cry
- {
- public Cry()
- {
- voice= "小狗,汪汪汪";
- }
- public Cry(string voices)
- {
- if (string.IsNullOrWhiteSpace(voices))
- {
- voice = "旺旺旺";
- }
- voice= $"小狗,{voices}";
- }
- public Cry(string name, string voices):this(voices)
- {
- if (string.IsNullOrWhiteSpace(voices))
- {
- voice = "旺旺旺";
- }
- if (string.IsNullOrWhiteSpace(name))
- {
- voice = "柴犬";
- }
- voice= $"{name},{voices}";
- }
- public static string voice { get; set; }
- }
ConfigureServices 中添加注册
- containerBuilder.RegisterType<Cry>().UsingConstructor(typeof(string));
Autofac会默认从容器中选择参数最多的构造函数,如果想要指定选择的话可以指定UsingConstructor
2、 实例化注入
还是上面的Cry类
ConfigureServices 中添加注册
- var output = new Cry("叫声叫声");
- containerBuilder.RegisterInstance(output).ExternallyOwned();
先对对象实例化然后注册,ExternallyOwned--配置组件,使容器永远不会处理实例。
修改Test控制器
- public IActionResult Index()
- {
- ViewBag.Animal = Cry.voice;
- return View();
- }
1.4、 注入的生命周期
1、 Transient(暂时生存期)--暂时生存期服务是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。
2、 Scoped(范围生存期)--范围生存期服务是每个客户端请求连接时创建的一次实例
3、 Singleton(单例生存期)--单例生存期会在程序第一次请求是创建一次实例,不会变化的
我们来利用生成guid来看一下三个的生命周期有什么具体的不一样
修改Test控制器
- public class TestController : Controller
- {
- private static IGetTransient _getTransient;
- private static IGetScoped _getScoped;
- private static IGetSingleton _getSingleton;
- public TestController(IGetTransient getTransient, IGetScoped getScoped, IGetSingleton getSingleton)
- {
- _getTransient = getTransient;
- _getScoped = getScoped;
- _getSingleton = getSingleton;
- }
- public IActionResult Index()
- {
- ViewBag.getTransient = _getTransient.GuidItem();
- ViewBag.getScoped = _getScoped.GuidItem();
- ViewBag.getSingleton = _getSingleton.GuidItem();
- return View();
- }
- }
修改Index.cshtml
- <div>
- <span>Transient:</span><span>@ViewBag.getTransient</span>
- </div>
- <div>
- <span>Scoped:</span><span>@ViewBag.getScoped</span>
- </div>
- <div>
- <span>Singleton:</span><span>@ViewBag.getSingleton</span>
- </div>
IGuid接口
- public interface IGuid
- {
- Guid GuidItem();
- }
- /// <summary>
- /// 暂存生存期
- /// </summary>
- public interface IGetTransient : IGuid
- {
- }
- /// <summary>
- /// 范围生存期
- /// </summary>
- public interface IGetScoped : IGuid
- {
- }
- /// <summary>
- /// 单例生存期
- /// </summary>
- public interface IGetSingleton : IGuid
- {
- }
GuidServiceBase类
- public class GuidServiceBase: IGuid
- {
- private readonly Guid _item;
- public GuidServiceBase()
- {
- _item = Guid.NewGuid();
- }
- public Guid GuidItem()
- {
- return _item;
- }
- }
- /// <summary>
- /// 暂存生存期
- /// </summary>
- public class GuidTransientService : GuidServiceBase, IGetTransient
- {
- }
- /// <summary>
- /// 范围生存期
- /// </summary>
- public class GuidScopedService : GuidServiceBase, IGetScoped
- {
- }
- /// <summary>
- /// 单例生存期
- /// </summary>
- public class GuidSingletonService : GuidServiceBase, IGetSingleton
- {
- }
ConfigureServices 中添加注册
- containerBuilder.RegisterType<GuidTransientService>().As<IGetTransient>();
- containerBuilder.RegisterType<GuidScopedService>().As<IGetScoped>().InstancePerLifetimeScope();
containerBuilder.RegisterType<GuidSingletonService>().As<IGetSingleton>().SingleInstance();
运行起来发现Singleton(单例生存期)没有变化,仅产生了一个实例,但是Scoped(范围生存期) 变化的不一样,按照理论来说应该刷新之后会变化,但是两边应该会是一样的值。--(因为两个页面依然是独立的,并不是一次请求)。我们换另一种方式验证这个
修改Test控制器—新增Guid
- public IActionResult Guid()
- {
- return View();
- }
添加Guid.cshtml—通过inject注入依赖
- @{
- Layout = null;
- }
- @inject WebApplication3.IGetTransient TransientService
- @inject WebApplication3.IGetScoped GuidScopedService
- @inject WebApplication3.IGetSingleton GuidSingletonService
- <!DOCTYPE html>
- <html>
- <head>
- <meta name="viewport" content="width=device-width" />
- <title>Guid</title>
- </head>
- <body>
- <div class="row">
- <div>
- <h2>GuidItem Shows</h2>
- <h3>TransientItem: @TransientService.GuidItem()</h3>
- <h3>ScopedItem: @GuidScopedService.GuidItem()</h3>
- <h3>SingletonItem: @GuidSingletonService.GuidItem()</h3>
- </div>
- </div>
- </body>
- </html>
修改Index.cshtml
- @{
- ViewData["Title"] = "Index";
- }
- <h1>Index</h1>
- @Html.Partial("Guid")
- <h1>Guid</h1>
- @Html.Partial("Guid")
运行然后打开两个页面
我们再次完全吻合的,暂时生命周期在每次使用的时候的Guid(实例)都是变化的,范围生命周期在同一个请求范围内Guid是不变化的,不同请求的Guid是会发生变化的。但是单例生命周期的Guid从程序开始就不会发生变化的。
欢迎大家扫描下方二维码,和我一起学习更多的知识
依赖注入容器-- Autofac的更多相关文章
- 依赖注入容器Autofac的详解
Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Aut ...
- 依赖注入容器Autofac与MVC集成
Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近.契合C#语言的特点.随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关 ...
- 深入浅出依赖注入容器——Autofac
1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ...
- Autofac依赖注入容器
依赖注入容器-- Autofac https://github.com/danielpalme/IocPerformance Unity 更新频率高,微软的项目Grace 综合性能更高 目录: 一.简 ...
- Asp.Net Core 进阶(三)—— IServiceCollection依赖注入容器和使用Autofac替换它
Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ...
- 依赖注入之Autofac使用总结
依赖倒置?控制反转(IOC)? 依赖注入(DI)? 你是否还在被这些名词所困扰,是否看了大量理论文章后还是一知半解了? 今天我想结合实际项目,和正在迷惑中的新手朋友一起来学习和总结依赖注入Autofa ...
- webapi框架搭建-依赖注入之autofac
前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...
- 大比速: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提供了众多的远程服务形式.在只 ...
- 依赖注入(二)Autofac简单使用
Autofac简单使用 源码下载传上源码,终于学会传文件了. 首先 还是那句话:“不要信我,否则你死得很惨!”. C#常见的依赖注入容器 IoC in .NET part 1: Autofac IoC ...
随机推荐
- VueJs(11)---vue-router(进阶2)
vue-router(进阶2) 上篇文章讲了第一篇vue-router相关文章,文章地址:VueJs(10)---vue-router(进阶1) 一.命名路由 有时候,通过一个名称来标识一个路由显得更 ...
- java float double精度为什么会丢失?浅谈java的浮点数精度问题 【转】
由于对float或double 的使用不当,可能会出现精度丢失的问题.问题大概情况可以通过如下代码理解: public class FloatDoubleTest { public static vo ...
- mysql数据库的安装步骤
Redhat6.5 1.准备工作 卸载使用rpm包安装的mysql-server.mysql软件包 安装自带的ncurses-devel包 rpm -ivh /mnt/Packages/ncurses ...
- 一文读懂阻塞、非阻塞、同步、异步IO
介绍 在谈及网络IO的时候总避不开阻塞.非阻塞.同步.异步.IO多路复用.select.poll.epoll等这几个词语.在面试的时候也会被经常问到这几个的区别.本文就来讲一下这几个词语的含义.区别以 ...
- 利用css实现hover动态效果
.font em:hover { font-size: 2em } .font strong:hover { font-weight: normal } .font span:hover { colo ...
- Runc 简介
RunC 是什么? RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好.我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器.事实上,r ...
- Django 项目创建之前的环境搭建
安装虚拟管理环境 sudo apt install virtualenv 在项目中运行 virtualenv fruitenv 进入到环境中 source fruitenv/bin/activate ...
- ubuntu宽带连接
1.打开终端: 输入:sudo pppoeconf 根据提示输入宽带用户名和密码,若提示Plugin rp-pppoe.so loaded.则已连接成功.2.手动开启/断开连接: p ...
- .net如何使用系统中没有安装的字体?
不想安装到客户端的 Fonts 目录下面,但是我又想在程序中使用它. 这段代码放在哪里? 字体文件需要放到要安装的机器上吗?并不需要 System.Drawing.Text.PrivateFontCo ...
- html5中让页面缩放的4种方法
1.viewport 这种方法,不是所有的浏览器都兼容<meta name="viewport" content="width=640,minimum-scale= ...