Autofac的使用
Autofac的使用
「Autofac简介」 「基本的使用方式」 「如何实现webapi控制器自动注入接口」
一、Autofac简介
❝
Autofac是实现依赖注入的类库之一,他可以帮助你实现程序的解耦,所谓 「“上层模块不应依赖于底层模块,应当依赖于抽象,而不应依赖于细节”」,哈哈,咱们说点白话吧,意思就是说 「顶层的模块不应直接依赖于底层模块以及具体的实现,应当有个抽象层在中间,只知道有什么方法就行, 具体怎么实现,细节不管」,这样的好处在于解耦,顶层模块通过接口得到对应实现,不在乎到底是哪个具体对象,只要有这个方法就可以(接口嘛),可以任意更换接口对应实现,而不需要修改代码。
❞
二、基本使用
使用方式如下
❝
首先打开NuGet获取Autofac.Integration.WebApi,获取了之后,引用中会多出如下两个dll库
❞
「Autofac.dll」(这个非常重要,主要使用它) 「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的使用的更多相关文章
- AutoFac在项目中的应用
技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github.com/dunitian/LoTCode ...
- Autofac - MVC/WebApi中的应用
Autofac前面写了那么多篇, 其实就是为了今天这一篇, Autofac在MVC和WebApi中的应用. 一.目录结构 先看一下我的目录结构吧, 搭了个非常简单的架构, IOC(web), IBLL ...
- Autofac - 生命周期
实例生命周期决定在同一个服务的每个请求的实例是如何共享的. 当请求一个服务的时候,Autofac会返回一个单例 (single instance作用域), 一个新的对象 (per lifetime作用 ...
- Autofac - 属性注入
属性注入不同于通过构造函数方式传入参数. 这里是通过注入的方式, 在类创建完毕之后, 资源释放之前, 给属性赋值. 这里, 我重新弄一些类来演示这一篇吧. public class ClassA { ...
- Autofac 的点滴
泛型类型的注册和使用 public interface IRepository<T> where T:class { } public interface ISchoolDetailRep ...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...
- Autofac 的属性注入,IOC的坑
Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...
- Autofac 组件、服务、自动装配 《第二篇》
一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...
- 使用Adminlite + ASP.NET MVC5(C#) + Entityframework + AutoFac + AutoMapper写了个api接口文档管理系统
一.演示: 接口查看:http://apidoc.docode.top/ 接口后台:http://apiadmin.docode.top/ 登录:administrator,123456 二.使用到的 ...
- autofac 组件的实例范围
实例范围决定如何在请求之间共享服务. 原文地址:http://docs.autofac.org/en/latest/lifetime/instance-scope.html 每个依赖一个实例 使用这个 ...
随机推荐
- SpringBoot 集成SpringSecurity JWT
目录 1. 简介 1.1 SpringSecurity 1.2 OAuth2 1.3 JWT 2. SpringBoot 集成 SpringSecurity 2.1 导入Spring Security ...
- Hive学习目录
大数据之Hive学习目录 第 1 章 Hive入门 1.1 什么是Hive 1.2 Hive的优缺点 1.2.1 优点 1.2.2 缺点 1.3 *Hive架构原理 1.4 Hive和数据库比较 第 ...
- cinder 卷迁移进度的代码分析
一.cinder-api服务的入口函数 D:\code-program\cinder-ocata_cinder\cinder\api\contrib\admin_actions.py from cin ...
- Dubbo源码学习之-通过源码看看dubbo对netty的使用
前言 前段时间,从头开始将netty源码了解了个大概,但都是原理上理解.刚好博主对dubbo框架了解过一些,这次就以dubbo框架为例,详细看看dubbo这种出色的开源框架是如何使用netty的,又是 ...
- vs _ 用户代码片段 _ html模板
自定义模板:首选项 -> 用户代码片段 - >(如果没有自己创个)html.json t : 表示缩进 n:表示换行 ----------------------------------- ...
- Bellman-Ford算法 例题:P3371 单源最短路径
看到还没人用Bellman-Ford过,赶紧水一发 lz非常弱,求各位大佬轻喷qwq 洛谷题目传送门:P3371 0."松弛"操作 如果存在一条边\((u,v)\)通过中继的方式可 ...
- C++入门记-大纲
缘来 由于某个不可告人的目标以及想趁着还有精力的年龄,开始了C++学习之路.C++ 诞生很多年了,但依然具有强大的生命力. 我们来看下2020年8月TIOBE 8 月编程语言排行榜. 可以看到C以及C ...
- 力扣Leetcode 1518. 换酒问题
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒.你购入了 numBottles 瓶酒. 如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的. 请你计算 最多 能喝到多少瓶酒. 示例: ...
- C++标准模板库(STL)常用介绍
1. 输入输出 C++既可以用C的scanf和printf,也可以用新增的的cin与cout,后者速度慢 1.1 C程序中输入输出 int a; scanf("%d",&a ...
- 牛哄哄的celery
一.什么是Celery 1.1.celery是什么 Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度. Celery的架构由三部分组成, ...