06、NetCore2.0依赖注入(DI)之整合Autofac

除了使用NetCore2.0系统的依赖注入(DI)框架外,我们还可以使用其他成熟的DI框架,如Autofac、Unity等。只要他们支持IServiceProvider接口规范。我们这次尝试使用Autofac来替代系统DI框架。

------------------------------------------------------------------------------------------------------------

写在前面:这是一个系列的文章,总目录请移步:NetCore2.0技术文章目录

------------------------------------------------------------------------------------------------------------

一、安装支持NetCore2.0的Autofac包

使用VS2017创建一个空的MVC项目,准备在这个项目中整合Autofac

1.安装核心包

install-package autofac

2.安装扩展包

install-package Autofac.Extensions.DependencyInjection

就是它支持了IServiceProvider接口规范:

using System;
using Microsoft.Extensions.DependencyInjection; namespace Autofac.Extensions.DependencyInjection
{
public class AutofacServiceProvider : IServiceProvider, ISupportRequiredService
{
public AutofacServiceProvider(IComponentContext componentContext);
public object GetRequiredService(Type serviceType);
public object GetService(Type serviceType);
}
}

二、在Web应用中整合Autofac

系统DI框架入口是Startup.ConfigureServices方法:

        public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IRun, Run>(); return services.BuildServiceProvider();
}

我们可以看出,这个方法配置了IServiceProvider的实现。那么,我们的整合方法就是用Autofac实现的IServiceProvider对象,替换系统的IServiceProvider。

        public IContainer ApplicationContainer { get; private set; }

        public IServiceProvider ConfigureServices(IServiceCollection services)
{
var builder = new ContainerBuilder(); // 注入方式1:autofac将全盘接收
services.AddSingleton<IRun, Run>(); // 注入方式2: autofac自行注册
//builder.RegisterType<Run>().As<IRun>(); builder.Populate(services);
this.ApplicationContainer = builder.Build(); return new AutofacServiceProvider(this.ApplicationContainer);
}

可以看出,既可以用原有的方式注册服务,也可以用Autofac方式注册,最后Autofac会全盘接收管理。其中自定义的接口如下:

   interface IRun
{
string Show();
} public class Run : IRun
{
public string Show()
{
return "奔跑吧,兄弟";
} }

下面我们在业务中调用这个接口,看是否成功。

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.Run(async (context) =>
{
await context.Response.WriteAsync(app.ApplicationServices.GetService<IRun>().Show());
});
}

运行效果是ok的^_^,不难体会到,接口的对扩展开放特点。

06、NetCore2.0依赖注入(DI)之整合Autofac的更多相关文章

  1. 05、NetCore2.0依赖注入(DI)之Web应用启动流程管理

    05.NetCore2.0依赖注入(DI)之Web应用启动流程管理 在一个Asp.net core 2.0 Web应用程序中,启动过程都做了些什么?NetCore2.0的依赖注入(DI)框架是如何管理 ...

  2. 07、NetCore2.0依赖注入(DI)之生命周期

    07.NetCore2.0依赖注入(DI)之生命周期 NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢? -------------- ...

  3. Yii2.0 依赖注入(DI)和依赖注入容器的原理

    依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...

  4. .Net Core3.0依赖注入DI

    构建ASP.NET Core应用程序的时候,依赖注入已成为了.NET Core的核心,这篇文章,我们理一理依赖注入的使用方法. 不使用依赖注入 首先,我们创建一个ASP.NET Core Mvc项目, ...

  5. .netCore2.0 依赖注入

    依赖注入(ID)是一种实现对象及其合作者或者依赖想之间松散耦合的技术对于传统的方法来说,获取类的方法通常用new如下 public class DIController : Controller { ...

  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. 依赖注入(DI)和Ninject

    [ASP.NET MVC 小牛之路]04 - 依赖注入(DI)和Ninject 本文目录: 1.为什么需要依赖注入 2.什么是依赖注入 3.使用NuGet安装库 4.使用Ninject的一般步骤 5. ...

  8. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  9. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

随机推荐

  1. 小程序实现非swiper组件的自定义伪3D轮播图

    效果如下: 我用了很笨的方法实现的,大致就是: 1.当前点击的div(view)如果前后都有内容,那么,当前div(view)就设置到中间,前一个就设置到左边,前一个的前面所有全部设置到最左边,后面一 ...

  2. Nginx阻止对不明确主机名的请求

    在用户请求头中,有可能会有Host行不明确的情况,如果不想处理这类用户请求,那么可以定义一个默认的server来丢弃这类请求.例如 server{ listen default_server; ser ...

  3. JAVA关于一些变量的技巧

    如果一个变量的值不变,而且他还要被多次用到 另建一个类,把变量定义到里面   注意  private static      public class JexlConfig {     private ...

  4. python学习笔记1——基础

    1)注释 单行注释以#开头,例:#第一个注释 多行注释可用多个#号,还有'''和""",例: #第一行注释 #第二行注释 ''' 第三行注释 第四行注释 ''' &quo ...

  5. CPP 栈 示例

    #include<iostream> #include<stdlib.h> using namespace std; typedef struct node { int dat ...

  6. logging日志

    import logging logging.basicConfig(filename='log.log', format='%(asctime)s - %(name)s - %(levelname) ...

  7. DML数据操作语言之谓词,case表达式

    谓词:就是返回值是真值的函数. 前面接触到的“>” “<” “=”等称为比较运算符,它们的正式名称就是比较谓词.因为它们比较之后返回的结果是真值. 由于谓词 返回的结果是一个真值 ,即tr ...

  8. Linux的打印rpm包的详细信息的shell脚本

    #!/bin/bash # list a content summary of a number of RPM packages # USAGE: showrpm rpmfile1 rpmfile2 ...

  9. Java基础类库简介

    Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...

  10. javaScript识别网址文本并转为链接文本

    最近项目有个需求:用户之间发送消息时,如果发送者输入的信息中含有网址文本,要在接受者界面中显示网址链接,点击该链接直接跳转到网页.这个功能和 QQ 发送网址文本的效果非常像,可以说是一模一样的. 思路 ...