Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac(转)

经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当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文件夹中。






双击代码全选

1

2

3

4

5

6

7

public class TxtLog:ILog   

{   

    public
void Save(string message)   

    {   

        //save as txt   

    }   

}

HomeController需添加一个ILog类型变量,为了直观看到类名,我把_log的类名赋给ViewBag.LogTypeName并显示出来。代码如下:






双击代码全选

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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方法中添加配置代码,如下:






双击代码全选

1

2

3

4

5

6

7

8

9

10

11

12

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中配置文件的代码:

  1. builder.RegisterControllers注册了当前程序集内所有的Controller类。

  2. builder.RegisterAssemblyTypes注册了当前程序集内的所有类。

如果此刻需求改变,我们需要将所有的TxtLog换成DbLog,该怎么办?首先添加DBLog类,如下:






双击代码全选

1

2

3

4

5

6

7

public class DbLog:ILog   

{   

    public
void Save(string message)   

    {   

        //save to Db.   

    }   

}

然后在Application_Start的方法的末端处添加如下代码:






双击代码全选

1

builder.RegisterType<DbLog>().As<ILog>();

运行程序,看到页面如下:

可看出ILog的类型已变成了DbLog。但为何要强调末端处?实际上,DBLog已经通过builder.RegisterAssemblyTypes被注册过一次,如果对同一个类型或接口注册多次(比如这里的ILog),在Autofac中会以列表的形式保存,如果只取一个,则Autofac会从列表返回最新的那个。

为了证明,我们在HomeController中再加入一个变量,类型为IEnumerable<ILog>,然后将列表中所有类名显示出来,用逗号隔开。






双击代码全选

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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会发现方法内部就是这种思路:






双击代码全选

1

2

3

4

5

6

7

8

9

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的开源站点也都是这么做的。

结语

未完,待续……^_^

Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac(转),布布扣,bubuko.com

时间: 2024-08-06 20:02:37

Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac(转)的相关文章

Asp.net mvc中整合autofac

创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofac官网下载来引入类库.个人推荐前者,因为从VS2010开始,已内集可视化的NuGet功能,使用起来非常方便.如下图所示: 这是vs2012的界面,点击“Manage NuGet Packages…”,弹出窗体如下,在右上角搜索框中输入“Autofac”,找到对应的库点击安装即可.这里需要应用的库有两

在asp.net mvc 中使用Autofac

据说.net 世界里,最强的依赖注入容器是Autofac .不管是谁,Nopcommerce2.8 用了它,所以就简单研究一下喽. 用vs 2012 创建一个Asp.net mvc3 的样例项目.然后使用NuGet(Vs2012 自带的有,版本低的话,似乎要安装插件),下载安装autofac的dll,如图1,2. 图1 NuGet 图2 ,load  autofac autofac 要加载两个dll哦,一个是autofac 的core ,另外一个是和asp.net mvc3集成的dll 然后,我

IOC 容器在 ASP.NET MVC 中的应用

IOC:Inversion Of Control 翻译为控制反转,我们在面向对象软件开发过程中,一个应用程序它的底层结构可能由N种不同的构件来相互协作来完成我们定义的系统的业务逻辑.哪么每一个构件可能相互独立和相互依赖,如果相互依赖的构件中的某一个构件出现异常,就会影响到整个系统的稳定运行,对象之间的耦合关系是无法避免的,也是必要的,因为这是协同工作的基础.如何降低系统之间.模块之间和对象之间的耦合度,是软件工程永远追求的目标之一.为了解决对象之间的耦合度过高的问题,IOC 的理念被提出,并被成

ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

原文:ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用) 在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. PS:本章将主要采用构造函数注入的方式,下一章将继续分享如何使之能够同时支持属性注入的方式. 约定: 1.仓储层接口都以“I”开头,以“Repos

ASP.NET MVC中简单使用Autofac

项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control.控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度. 示例代码: IProvinceRepository.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Libing.Portal.Web.Models { public i

《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架,它支持3种不同的技术来创建websites(网站)和Web应用:他们分别是,Web Pages,Web Forms,和MVC.虽然MVC是一种非常流行的,有完整的用于软件开发模式理论的技术,但它在ASP.NET中却是一种新的技术. 目前最新的版本是2012年发布的ASP.NET MVC4.自从2008年发布

[转] ASP.NET MVC 中你必须知道的 13 个扩展点

ScottGu 在其 最新的博文 中推荐了 Simone Chiaretta 的文章 13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了  ASP.NET MVC  中的 13 个扩展点.Keyvan Nayyeri(与Simone合著了 Beginning ASP.NET MVC 1.0 一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助.

在ASP.NET MVC中使用Castle Windsor

平常用Inject比较多,今天接触到了Castle Windsor.本篇就来体验其在ASP.NET MVC中的应用过程. Visual Studio 2012创建一个ASP.NET MVC 4网站. 通过NuGet安装Castle Windsor. 在当前项目下创建一个名称为"IOC"的文件夹. 在ASP.NET MVC中,每次请求,DefaultControllerFactory都会为我们创建controller实例,我们需要自定义一个派生自DefaultControllerFact

ASP.NET MVC中实现属性和属性值的组合,即笛卡尔乘积01, 在控制台实现

在电商产品模块中必经的一个环节是:当选择某一个产品类别,动态生成该类别下的所有属性和属性项,这些属性项有些是以DropDownList的形式存在,有些是以CheckBoxList的形式存在.接着,把CheckBoxList的选中项组合生成产品SKU项. 本系列将在ASP.NET MVC中实现以上功能.但本篇,先在控制台实现属性值的笛卡尔乘积. 关于属性的类: public class Prop { public int Id { get; set; } public string Name {