依赖注入容器-- Autofac

https://github.com/danielpalme/IocPerformance

Unity 更新频率高,微软的项目
Grace 综合性能更高

目录:

一、简介

二、如何使用

  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依赖注入容器的更多相关文章

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

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

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

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

  3. 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入

    一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...

  4. 【干货】利用MVC5+EF6搭建博客系统(二)测试添加数据、集成Autofac依赖注入

    PS:如果图片模糊,鼠标右击复制图片网址,然后在浏览器中打开即可. 一.测试仓储层.业务层是否能实现对数据库表的操作 1.在52MVCBlog.IRepository程序集下创建IsysUserInf ...

  5. ASP.NETCore使用AutoFac依赖注入

    原文:ASP.NETCore使用AutoFac依赖注入 实现代码 1.新建接口类:IRepository.cs,规范各个操作类的都有那些方法,方便管理. using System; using Sys ...

  6. ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下

    ADO.NET   一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data  → DataTable, ...

  7. Autofac依赖注入

    简介 Autofac 是一款超赞的.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 .它的实现方式是将常规的.net类当做 组件 处理. ...

  8. Asp.net core自定义依赖注入容器,替换自带容器

    依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...

  9. WPF PRISM开发入门二(Unity依赖注入容器使用)

    这篇博客将通过一个控制台程序简单了解下PRISM下Unity依赖注入容器的使用.我已经创建了一个例子,通过一个控制台程序进行加减乘除运算,项目当中将输入输出等都用接口封装后,结构如下: 当前代码可以点 ...

随机推荐

  1. BZOJ 2219 数论之神 (CRT推论+BSGS+原根指标)

    看了Po神的题解一下子就懂了A了! 不过Po神的代码出锅了-solve中"d-temp"并没有什么用QwQQwQQwQ-应该把模数除以p^temp次方才行. 来自BZOJ讨论板的h ...

  2. node简单起服务

    1.建一个app.js文件 const http = require('http'); const chalk = require('chalk'); const conf = require('./ ...

  3. HGOI 20190828 题解

    Problem A 数学题 设数论函数$f(x)$表示$x(x ∉ Prime)$的次大因数, 给出$l,r$求出$\sum\limits_{i=l,i ∉ Prime} ^r f(i)$ . 对于$ ...

  4. 顺序表应用4-2:元素位置互换之逆置算法(数据改进)(SDUT 3663)

    Problem Description 一个长度为len(1<=len<=1000000)的顺序表,数据元素的类型为整型,将该表分成两半,前一半有m个元素,后一半有len-m个元素(1&l ...

  5. Node.js 安装与开发

    Node.js 简介 Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.Node.js对一些 ...

  6. Nginx配置中的log_format用法梳理

    nginx服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,一般在nginx的配置文件中日记配置( ...

  7. 十七、mysql数据库备份

    使用java代码在window环境下实现定时执行Mysql备份与还原 //备份 public void doBackup() { Date currentTime = new Date(); Syst ...

  8. Python之禅 this模块

    The Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simp ...

  9. fatal error C1189: #error: "Oops: min() and/or max() are defined as preprocessor macros. Define NOMINMAX macro before including any system headers!"

    1.问题描述 vs2015 使用pg数据库的C++库文件4.0.1版本libpqxx.dll,包含头文件#include "pqxx\pqxx" 出现这个错误: fatal err ...

  10. 【Nginx】Linux 环境下 Nginx 配置SSL 证书

    一.解压三个包到相同目录编译nginx cd /usr/local/src/nginx-1.12.2 # 将下列的包版本号换成自己下载的版本号 ./configure --prefix=/usr/lo ...