Asp.net mvc中整合autofac
创建Asp.net MVC并引入Autofac
首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种。然后通过NuGet或到Autofac官网下载来引入类库。个人推荐前者,因为从VS2010开始,已内集可视化的NuGet功能,使用起来非常方便。如下图所示:

这是vs2012的界面,点击“Manage NuGet Packages…”,弹出窗体如下,在右上角搜索框中输入“Autofac”,找到对应的库点击安装即可。这里需要应用的库有两个“Autofac”和“Autofac ASP.Net MVC3 Integration”。

autofac实现对Controller的自动注入
现在HomeController需要用到日志记录功能。沿用上篇ILog接口,假设目前已有一种ILog的实现类--TxtLog,放在根目录下Services文件夹中。
- public class TxtLog:ILog
- {
- public void Save(string message)
- {
- //save as txt
- }
- }
HomeController需添加一个ILog类型变量,为了直观看到类名,我把_log的类名赋给ViewBag.LogTypeName并显示出来。代码如下:
public class HomeController : Controller
{
private ILog _log;
public HomeController(ILog log)
{
_log = log;
}
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
ViewBag.LogTypeName = _log.GetType().Name;
return View();
}
//....
接着,在对应页面加入以下代码(抱歉这里用英文描述,因为我的代码高亮插件不能显示中文):
- <h2>ILog's type name is @ViewBag.LogTypeName</h2>
此时运行程序会报错,因为HomeController找不到无参构造函数,而我们也没有给_log指定任何类型的实例。
现在我们让Autofac发挥作用,在Global文件的Application_Start方法中添加配置代码,如下:
- protected void Application_Start()
- {
- ......
- ContainerBuilder builder = new ContainerBuilder();
- builder.RegisterControllers(Assembly.GetExecutingAssembly());
- builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
- .AsImplementedInterfaces();
- var container = builder.Build();
- DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
- }
先不管含义,加了这些代码以后,再运行程序,会发现HomeController的ILog变量被赋予了TxtLog类型的实例,而我们并没有做任何new操作,结果如下图:

autofac应对需求变更
回头再看Application_Start中配置文件的代码:
- builder.RegisterControllers注册了当前程序集内所有的Controller类。
- builder.RegisterAssemblyTypes注册了当前程序集内的所有类。
如果此刻需求改变,我们需要将所有的TxtLog换成DbLog,该怎么办?首先添加DBLog类,如下:
- public class DbLog:ILog
- {
- public void Save(string message)
- {
- //save to Db.
- }
- }
然后在Application_Start的方法的末端处添加如下代码:
- builder.RegisterType<DbLog>().As<ILog>();
运行程序,看到页面如下:

可看出ILog的类型已变成了DbLog。但为何要强调末端处?实际上,DBLog已经通过builder.RegisterAssemblyTypes被注册过一次,如果对同一个类型或接口注册多次(比如这里的ILog),在Autofac中会以列表的形式保存,如果只取一个,则Autofac会从列表返回最新的那个。
为了证明,我们在HomeController中再加入一个变量,类型为IEnumerable<ILog>,然后将列表中所有类名显示出来,用逗号隔开。
- public class HomeController : Controller
- {
- private ILog _log;
- private IEnumerable<ILog> _logList;
- public HomeController(ILog log,IEnumerable<ILog> logList )
- {
- _log = log;
- _logList = logList;
- }
- public ActionResult Index()
- {
- ViewBag.Message = "Welcome to ASP.NET MVC!";
- ViewBag.LogTypeName = _log.GetType().Name;
- ViewBag.LogTypeNames = _logList.Select(x => x.GetType().Name).Aggregate((x, y) => x+","+y );
- return View();
- }
运行程序,页面显示如下:

可以看到,针对ILog接口注册了三个类型。前两个通过builder.RegisterAssemblyTypes注册,最后一个是我们手动添加。
但重复的注册类型总让人觉得不够优雅,因此实际开发中并不推荐一次性注册所有类,可条件筛选。翻开Autofac的源码,查看我们上文用到的builder.RegisterControllers会发现方法内部就是这种思路:
- public static IRegistrationBuilder<object, ScanningActivatorData, DynamicRegistrationStyle>
- RegisterControllers(
- this ContainerBuilder builder,
- params Assembly[] controllerAssemblies)
- {
- return builder.RegisterAssemblyTypes(controllerAssemblies)
- .Where(t => typeof(IController).IsAssignableFrom(t) &&
- t.Name.EndsWith("Controller"));
- }
由代码可知,该方法筛选出所有实现IController接口且类型名以“Controller”结尾的类。你可以根据自己项目的实际情况来筛选,很多使用Autofac的开源站点也都是这么做的。
结语
未完,待续……^_^
源地址:http://www.cnblogs.com/hkncd/archive/2012/11/28/2792474.html
Asp.net mvc中整合autofac的更多相关文章
- Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac
经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...
- asp.net MVC中使用Autofac小结 (遇到的最傻错误: 没有为该对象定义无参数的构造函数)
项目使用的MVC4,.net 4.5 Nuget安装最新的autofac,一直提示不支持.net 4.5.没办法了,最后用Nuget控制台安装的老版本.因为我使用的是MVC4,所以直接安装的是auto ...
- 如何在asp.net mvc 中使用Autofac 控制反转(Ioc)
前言 最近看了一些关于Ioc方面的开源项目,里面的类跳来转去,看的迷迷糊糊的.项目里根本不需要这么“复杂的”设计,只需简单完成Ico,达到解耦的目的,并且能高效的完成项目.于是参考autofac的官网 ...
- Asp.net mvc中应用autofac
1.nuget安装依赖
- ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 时 Session 关闭问题
一.问题描述 在向ASP.NET MVC中整合NHibernate.Spring.NET后,如下管理员与角色关系: 类public class Admin { public virtual strin ...
- 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, ...
- 如何在 ASP.NET MVC 中集成 AngularJS(1)
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...
- ASP.NET MVC IOC 之AutoFac
ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...
- 【ASP.NET MVC系列】浅谈jqGrid 在ASP.NET MVC中增删改查
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
随机推荐
- Flashback删除(闪回删除)
oracle 9i以前,当drop一个表时,到该表的所有引用都会从数据字典中删除. oracle 10g及以后,当drop一个表时,数据库根本没有删除表,而只是重命名了并放入了回收站.即当发出drop ...
- C#...何时需要重写ToString()方法?
一般类型,都是继承自System.Object类,默认情况下,object类的ToString方法会返回当前类的类型的字符串表达形式.但也有例外!! DateTime,它就重写ToString方法,D ...
- Redis之七种武器
长生剑.孔雀翎.碧玉刀.多情环.离别钩.霸王枪.拳头是古龙笔下的七种武器,而本文打算将Redis的几种使用方式 Strings.Hashs.Lists.Sets.Sorted Sets.Pub/Sub ...
- Unity3d 协程、调用函数、委托
(一)协程 开启方法:StartCoroutine("函数名"): 结束方法StopCoroutine("函数名"),StopAllCoroutines(); ...
- iOS10 权限崩溃问题-b
手机升级了 iOS10 Beta,然后用正在开发的项目 装了个ipa包,发现点击有关 权限访问 直接Crash了,并在控制台输出了一些信息: This app has crashed because ...
- php的redis 操作类,适用于单台或多台、多组redis服务器操作
redis 操作类,包括单台或多台.多组redis服务器操作,适用于业务复杂.高性能要求的 php web 应用. redis.php: <?php /* redis 操作类,适用于单台或多台. ...
- DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能
以前作的上传,在糙了,所以在用户体验上改进一下. 同时,结合DJANGO作定位上传. 这其中分两步进行,第一次上传到TMP目录下, 第二次,将TMP下的文件转移到标准目录下. form.py file ...
- ecos内核概览--bakayi译
http://blog.csdn.net/wangzaiwei2006/article/details/6453423
- 跨平台查询文件时间,如果超过7天,删除该文件(windows和linxu测试过)
windows调用的是_stat函数,linux调用的是stat函数. #include <time.h> #include <sys/types.h> #include &l ...
- python脚本工具 - 4 获取系统当前时间
#! /usr/bin/python import time current_time = time.strftime("%Y-%m-%d %H:%M") print curren ...