使用AutoFac实现依赖注入
1.基本使用
1.1新建MVC项目并安装Autofac
注意需要安装AutoFac和AutoFac.mvc5
Install-Package Autofac Install-Package Autofac.Mvc5 -Version

安装后的项目如图所示:

1.2.添加类库,用于接口及实现

为了区分Test和TestSec,在返回的日期格式做了处理。

1.3在Global.asax文件中完成接口的注册
AutoFac注册方法:
private void AutoFacRegister()
{
var builder = new ContainerBuilder();
//注册MVC控制器(注册所有到控制器)
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//可选,注册模型绑定
//builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
//builder.RegisterModelBinderProvider();
//可选,注册web抽象层例如HttpContextBase
//builder.RegisterModule<AutofacWebTypesModule>();
//可选,启用视图页属性注入
//builder.RegisterSource(new ViewRegistrationSource());
//可选,启用方法参数注入
//builder.InjectActionInvoker();
/*接口实现*/
builder.RegisterType<Test>().As<ITest>();
builder.RegisterType<TestSec>().As<ITestSec>();
//设置依赖解析器
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
将AutoFac加入代码启动程序:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AutoFacRegister();
}
1.4新建TestController控制器,进行测试
在控制器的构造函数中初始化接口:
private ITest test;
private ITestSec testSec;
public TestController(ITest test,ITestSec testSec)
{
this.test = test;
this.testSec = testSec;
}
添加接口用于测试:
public JsonResult GetTest()
{
dynamic result=new {
Time1=test.GetDateTime(),
Time2=testSec.GetDateTime()
};
return this.Json(result, JsonRequestBehavior.AllowGet);
}
注意黄色背景文字,设置为可通过get方式获取,否则地址栏直接访问会报错
1.5测试结果

2.代码优化
刚才的 ITest 和 ITestSec 两个接口均在TestController控制器的构造函数中注入,但是如果所有的接口都放在这里的话,那控制器中的构造函数可能会非常的乱。想想一个项目几十个接口,每个接口还可能复用了其他接口,并且调用时还需要接口向下传递,所以刚才的写法并不优雅。
在02AutoFac.Application中新建 IComonService 接口:
public interface IComonService
{
dynamic GetTest();
}
通过 ICommonService 调用ITest和ITestSec接口,实现如下:
public class CommonService:IComonService
{
private ITest test;
private ITestSec testSec;
public CommonService(ITest test,ITestSec testSec)
{
this.test = test;
this.testSec = testSec;
}
public dynamic GetTest()
{
dynamic result = new
{
Time1=test.GetDateTime(),
Time2=testSec.GetDateTime()
};
return result;
}
}
如此ITest和ITestSec两个接口变注入到CommonService方法中,修改控制器如下:
private IComonService commonService;
public TestController(IComonService commonService)//(ITest test,ITestSec testSec)
{
this.commonService = commonService;
}
public JsonResult GetTest()
{
dynamic result = commonService.GetTest();
return Json(result, JsonRequestBehavior.AllowGet);
}
注意修改 Global.asax 中的注入程序:
private void AutoFacRegister()
{
var builder = new ContainerBuilder();
//注册MVC控制器(注册所有到控制器)
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//可选,注册模型绑定
//builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
//builder.RegisterModelBinderProvider();
//可选,注册web抽象层例如HttpContextBase
//builder.RegisterModule<AutofacWebTypesModule>();
//可选,启用视图页属性注入
//builder.RegisterSource(new ViewRegistrationSource());
//可选,启用方法参数注入
//builder.InjectActionInvoker();
/*接口实现*/
builder.RegisterType<Test>().As<ITest>();
builder.RegisterType<TestSec>().As<ITestSec>();
builder.RegisterType<CommonService>().As<IComonService>();
//设置依赖解析器
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
3.消灭构造函数
上述两种方法已经能实现基本的注入,但是当一个接口依赖于过多的子接口时,构造函数会变的异常的庞大。最关键的是,上述只适用于接口传递,如果对于某个需要实例化的类中调用某个接口,则无法实现(才疏学浅,此处不对还望指出)
通过将container写为全局解决,注意此时的TestService类的构造函数已经无参
namespace _02AutoFac.Application
{
public class TestService
{
ITest test;
ITestSec testSec;
public TestService()
{
test = AutoFacHelper.GetService<ITest>();
testSec = AutoFacHelper.GetService<ITestSec>();
}
public dynamic GetTest()
{
dynamic result = new
{
time1=test.GetDateTime(),
time2=testSec.GetDateTime()
};
return result;
}
}
}
控制器调用实例化的方法:
public JsonResult GetTest()
{
TestService service = new TestService();
dynamic result = service.GetTest();
return Json(result, JsonRequestBehavior.AllowGet);
}
新增的AutoFacHelper方法:
public class AutoFacHelper
{
private static IContainer container;
public static void InitAutoFac()
{
var builder = new ContainerBuilder();
//注册MVC控制器(注册所有到控制器)
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//可选,注册模型绑定
//builder.RegisterModelBinders(typeof(MvcApplication).Assembly);
//builder.RegisterModelBinderProvider();
//可选,注册web抽象层例如HttpContextBase
//builder.RegisterModule<AutofacWebTypesModule>();
//可选,启用视图页属性注入
//builder.RegisterSource(new ViewRegistrationSource());
//可选,启用方法参数注入
//builder.InjectActionInvoker();
/*接口实现*/
builder.RegisterType<Test>().As<ITest>();
builder.RegisterType<TestSec>().As<ITestSec>();
builder.RegisterType<CommonService>().As<IComonService>();
//设置依赖解析器
container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
public static T GetService<T>()
{
T t = container.Resolve<T>();
return t;
}
}
代码地址
https://github.com/imstrive/ConsoleTest/tree/master/02AutoFacTest

使用AutoFac实现依赖注入的更多相关文章
- NopCommerce使用Autofac实现依赖注入
NopCommerce的依赖注入是用的AutoFac组件,这个组件在nuget可以获取,而IOC反转控制常见的实现手段之一就是DI依赖注入,而依赖注入的方式通常有:接口注入.Setter注入和构造函数 ...
- Autofac之依赖注入
这里主要学习一下Autofac的依赖注入方式 默认构造函数注入 class A { public B _b; public A() { } public A(B b) { this._b = b; } ...
- Web API(六):使用Autofac实现依赖注入
在这一篇文章将会讲解如何在Web API2中使用Autofac实现依赖注入. 一.创建实体类库 1.创建单独实体类 创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下: us ...
- NET Core源代码通过Autofac实现依赖注入
查看.NET Core源代码通过Autofac实现依赖注入到Controller属性 阅读目录 一.前言 二.使用Autofac 三.最后 回到目录 一.前言 在之前的文章[ASP.NET Cor ...
- 查看.NET Core源代码通过Autofac实现依赖注入到Controller属性
一.前言 在之前的文章[ASP.NET Core 整合Autofac和Castle实现自动AOP拦截]中,我们讲过除了ASP.NETCore自带的IOC容器外,如何使用Autofac来接管IServi ...
- 【AutoFac】依赖注入和控制反转的使用
在开始之前首先解释一下我认为的依赖注入和控制反转的意思.(新手理解,哪里说得不正确还请指正和见谅) 控制反转:我们向IOC容器发出获取一个对象实例的一个请求,IOC容器便把这个对象实例“注入”到我们的 ...
- WebAPi使用Autofac实现依赖注入
WebAPi依赖注入 使用记录 笔记 1.NuGet包安装 2.控制器加入构造函数 3.Global.asax ----Application_Start 应用程序启动时 using Autofa ...
- Autofac 泛型依赖注入
using Autofac;using Autofac.Extensions.DependencyInjection;using Hangfire;using Microsoft.AspNetCore ...
- 五:.net core(.NET 6)使用Autofac实现依赖注入
Autofac的简单使用: 由于将来可能引用很多包,为了保持统一队形,我们再新建一个类库项目Wsk.Core.Package,当做包的引用集合: 删掉Class1,把Wsk.Core.Wsk.Core ...
- 转 Autofac怎么依赖注入ASP.NET MVC5类的静态方法
之前我有介绍过怎么在ASP.NET mvc5中实现的Controller的依赖注入.一般是通过Contrller的构造函数的参数或者属性来注入,但是这有一个共同点就是调用这个类的方法一般都是实例方法, ...
随机推荐
- c++进阶学习
以后可能要做c++开发了..记录要看的书和可能用的技术,让自己有个学习的方向... 1. 语言基础 2. 算法与数据结构基础 3. 多线程开发基础 4. 数据库 5. 网络编程 6. 内存数据库技 ...
- 使用C#的HttpWebRequest模拟登陆网站
很久没有写新的东西了,今天在工作中遇到的一个问题,感觉很有用,有种想记下来的冲动. 这篇文章是有关模拟登录网站方面的. 实现步骤: 启用一个web会话 发送模拟数据请求(POST或者GET) 获取会话 ...
- Nginx 配置反向代理后,页面中取绝对URL地址的问题显示代理端口
本文有V型知识库提供 upstream tomcat { server 127.0.0.1:82;} location / { proxy_pass http://tomcat;} 如上 ...
- Webpack2学习记录-1
1.安装前准备 安装 webpack 之前,需要安装 node,这时最新的是 6,npm 是 4.如果有老的 node 项目在跑建议安装下 nvm. 2.建议安装在局部,即在项目下的 node_mod ...
- Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection
学习目标 Understand the challenges of Object Localization, Object Detection and Landmark Finding Underst ...
- spring cloud(学习笔记) Enreka服务治理
服务治理是微服务架构最为核心和基础的模块,主要用来实现各个微服务实例的自动化注册和发现. 记录一下服务注册中心的搭建以及高可用注册中心的实现 1.首先创建两个基础 的spring boot工程,spr ...
- fastclick.js插件使用简单说明
为什么存在延迟? 从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 300 毫秒的等待时间.为什么这么设计呢? 因为它想看看你是不是要进行双击(double tap)操作. ...
- JDK、JRE、JVM三者间的关系(待更新...)
JDK(Java Development Kit) JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是jvm,lib中则是jv ...
- 【父元素parent】【子元素children】【同胞siblings】【过滤】
1.父元素 $("span").parent() //定位到span的父元素 $("span").parents() // ...
- list补充,append()、extend()、insert()、remove()、del()、pop()、分片
1.添加 append(object),是指在列表的末尾添加一个元素. >>> arr = [1,2,'a','你好',[11,22,33]] >>> arr [1 ...