Autofac的使用

  1. 「Autofac简介」
  2. 「基本的使用方式」
  3. 「如何实现webapi控制器自动注入接口」

一、Autofac简介

Autofac是实现依赖注入的类库之一,他可以帮助你实现程序的解耦,所谓 「“上层模块不应依赖于底层模块,应当依赖于抽象,而不应依赖于细节”」,哈哈,咱们说点白话吧,意思就是说 「顶层的模块不应直接依赖于底层模块以及具体的实现,应当有个抽象层在中间,只知道有什么方法就行, 具体怎么实现,细节不管」,这样的好处在于解耦,顶层模块通过接口得到对应实现,不在乎到底是哪个具体对象,只要有这个方法就可以(接口嘛),可以任意更换接口对应实现,而不需要修改代码。

二、基本使用

  • 使用方式如下

首先打开NuGet获取Autofac.Integration.WebApi,获取了之后,引用中会多出如下两个dll库

  1. 「Autofac.dll」(这个非常重要,主要使用它)
  2. 「Autofac.Integration.WebApi.dll」(这个在实现WebApi自动注入时需要)

项目中引入了Autofac的dll库后,我们就可以开始正式使用Autofac了

基础使用
//创建IOC容器构建对象
var builder = new ContainerBuilder(); //注册接口与具体实现的对应
builder.RegisterType<SqlDatabase>().As<IDataBase>(); //创建容器——此时的容器中已有如上注册的映射关系
var container = builder.Build(); //通过容器注入接口,得到之前注册的具体实现
var db = container.Resolve<IDataBase>();
一个接口对应多个实现的使用
//创建IOC容器构建对象
var builder = new ContainerBuilder(); //注册同一接口对应多个实现,通过Named方法解决,加入关键字
builder.RegisterType<SqlDatabase>().Named<IDataBase>("sql");
builder.RegisterType<OracleDatabase>().Named<IDataBase>("oracle"); //创建容器——此时的容器中已有如上注册的映射关系
var container = builder.Build(); //通过容器注入接口+关键字,得到之前注册的具体实现
var dbSQL = container.ResolveNamed<IDataBase>("sql");
var dbOracle = container.ResolveNamed<IDataBase>("oracle");

WebApi中,使用Autofac自动注入控制器

跟Unity有所不同,Unity只要创建了正确的容器,在Application_Start中配置一下即可,「Unity」设置方式如下所示:

//实例化容器,并注册接口对应的资源类
var container = new UnityContainer();
container.RegisterType<IProductRepository, ProductRepository>();
//设置依赖
config.DependencyResolver = new UnityDependencyResolver(container)

到此,发起Webapi请求时,webapi控制器中的接口就会被注入

Autofac的webapi接口自动注入

废话不多说,很简单,如下所示:

//创建容器构建对象
var builder = new ContainerBuilder(); //注册接口与实现的对应
builder.RegisterType<SqlDatabase>().Named<IDataBase>("sql");
builder.RegisterType<OracleDatabase>().Named<IDataBase>("oracle"); //这点非常重要:将所有程序集加载进来
Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
//然后调用方法,将程序集中的所有webapi控制器注册到构建对象
builder.RegisterApiControllers(assemblies).PropertiesAutowired(); //创建容器——此时的容器中已有如上的注册映射关系,以及所有程序集中的webapi控制器的注册
var container = builder.Build(); //设置给依赖关系解析程序
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

此时,WebApi控制器已经可以自动注入接口
「Autofac不需要给属性设置Dependency特性,就可自动实现注入」

本文使用 mdnice 排版

Autofac的使用的更多相关文章

  1. AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...

  2. Autofac - MVC/WebApi中的应用

    Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...

  3. Autofac - 生命周期

    实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...

  4. Autofac - 属性注入

    属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...

  5. Autofac 的点滴

    泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...

  6. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...

  7. Autofac 的属性注入,IOC的坑

    Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...

  8. Autofac 组件、服务、自动装配 《第二篇》

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...

  9. 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统

    一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...

  10. autofac 组件的实例范围

    实例范围决定如何在请求之间共享服务. 原文地址:http://docs.autofac.org/en/latest/lifetime/instance-scope.html 每个依赖一个实例 使用这个 ...

随机推荐

  1. Oracle和Mysql分页的区别

    一.Mysql使用limit分页 select * from stu limit m, n; //m = (startPage-1)*pageSize,n = pageSize PS: (1)第一个参 ...

  2. RabbitMQ set password

    问题: -- ::09.387 ERROR oslo.messaging._drivers.impl_rabbit [req-51faf017-4f1f-4a24-ab79-624b302b839b ...

  3. chromium 源码下载地址

    下载链接:https://gsdview.appspot.com/chromium-browser-official/

  4. dcoker 小应用(一)

    docker 创建Ubuntu系统 1.创建Dockerfile #ubuntu:14.04 image FROM ubuntu:14.04 MAINTAINER XXX, xxx@xxx.com R ...

  5. Understanding dopamine and reinforcement learning: The dopamine reward prediction error hypothesis

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 在中脑多巴胺能神经元的研究中取得了许多最新进展.要了解这些进步以及它们之间的相互关系,需要对作为解释框架并指导正在进行的 ...

  6. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

  7. vue项目配置vuex

    在vue项目中各组件之间传值非常的好用,但是当组件数量多的时候,就会感觉到多个组件之间传值就会变的非常痛苦.因此就需要使用vuex来管理数据值,这样在任何页面不需要传值过来的情况下就可以拿到我们想要的 ...

  8. centos 7 对用过yum更新的软件服务进行降级

    centos 7 执行 yum update 会对现有服务软件进行更新,但是如果把不该升级的软件升级,彼此软件不兼容,如何进行降级,比如:kibana 必须与 elasticsearch 大版本相同, ...

  9. solrcloud集群版的搭建

    说在前面的话 之前我们了解到了solr的搭建,我们的solr是搭建在tomcat上面的,由于tomcat并不能过多的承受访问的压力,因此就带来了solrcloud的时代.也就是solr集群. 本次配置 ...

  10. manualresetevent的用法学习

    ManualResetEvent 允许线程通过发信号互相通信. 通常,此通信涉及一个线程在其他线程进行之前必须完成的任务. 当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Re ...