依赖注入容器-- 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和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成,并且开源,Autofac的主要特性如下: 1,灵活的组件实例化:Aut ... Autofac是应用于.Net平台的依赖注入(DI,Dependency Injection)容器,具有贴近.契合C#语言的特点.随着应用系统的日益庞大与复杂,使用Autofac容器来管理组件之间的关 ... 1.写在前面 相信大家对IOC和DI都耳熟能详,它们在项目里面带来的便利大家也都知道,微软新出的.NetCore也大量采用了这种手法. 如今.NetCore也是大势所趋了,基本上以.Net为技术主导的 ... 依赖注入容器-- Autofac https://github.com/danielpalme/IocPerformance Unity 更新频率高,微软的项目Grace 综合性能更高 目录: 一.简 ... Asp.Net Core 提供了默认的依赖注入容器 IServiceCollection,它是一个轻量级的依赖注入容器,所以功能不多,只是提供了基础的一些功能,要实现AOP就有点麻烦,因此在实际工作当 ... 依赖倒置?控制反转(IOC)? 依赖注入(DI)? 你是否还在被这些名词所困扰,是否看了大量理论文章后还是一知半解了? 今天我想结合实际项目,和正在迷惑中的新手朋友一起来学习和总结依赖注入Autofa ... 前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ... 大比速:remoting.WCF(http).WCF(tcp).WCF(RESTful).asp.net core(RESTful) 近来在考虑一个服务选型,dotnet提供了众多的远程服务形式.在只 ... Autofac简单使用 源码下载传上源码,终于学会传文件了. 首先 还是那句话:“不要信我,否则你死得很惨!”. C#常见的依赖注入容器 IoC in .NET part 1: Autofac IoC ... 直接上图 昨天还是好的今天就不行了,密码是没错的,就是本地的连接不上,Linux上的mysql可以连, 网上找各种解决方案,什么权限,什么加一句话,还有这个 如果连这个都进不去那就直接重装吧,其实 ... 一.下载ant包,解压放放到你的项目中 二.在ant文件夹下创建一个build.xml文件,内容如下 <?xml version="1.0" encoding="G ... flask快速入门 1.1.三种框架比较 Django: 重武器,内部包含了非常多组件:ORM.Form.ModelForm.缓存.Session.中间件.信号等 Flask:短小精悍,内部没有太多组 ... 第一步:创建项目 创建一个新项目,可以是ASP.NET MVC,WebForms,Winforms等多种.Net项目,这里使用的是VS2017,创建了一个MVC项目 创建完成后大致项目层级为: 第二部 ... [简介] 遍历器/迭代器.任何数据结构只要部署 Iterator 接口,就可以完成遍历操作.这种数据结构是“可遍历的”(iterable). 如何判断是否可遍历? typeof target[Symb ... 问题1复现路径: postgresql selected, no connection 第一步: db_connect postgres:toor@127.0.0.1/msfbook 连接成功不需要进 ... 一,异常的概念 程序在运行时,发生了我们没有预测的结果,它阻止了程序按照我们预期效果执行 二,怎么保证我们的程序在发生异常以后 ,代码继续执行? 异常处理机制 在程序发生异常以后,还能按照我们事先设定 ... 3个月没写PHP了,这是我的第一个中小型go的websocket微服务.那么问题来了,github上那么多轮子,我为什么要自己造轮子呢? Why 造轮子? 因为这样不仅能锻炼自己的技术能力,而且能帮助 ... 程序员的工作内容,除了大部分时间写代码之外,因为有不少的时间是用在调试代码上.甚至说不是在调试代码,就是即将调试代码. :) 今天我们来谈谈调试代码的一些技巧,在使用IDE提供的debugger时一些 ... http://www.yiibai.com/nodejs/node_install.html---node.js具体入门资料在此 Node JS事件循环 Node JS是单线程应用程序,但它通过事件和 ...依赖注入容器-- Autofac的更多相关文章
随机推荐