转于:http://www.cnblogs.com/WeiGe/p/3871451.html

一、为什么使用AutoFac?

之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~

Autofac是.NET领域最为流行的IOC框架之一,传说是速度最快的一个:

优点:

  • 它是C#语言联系很紧密,也就是说C#里的很多编程方式都可以为Autofac使用,例如可以用Lambda表达式注册组件
  • 较低的学习曲线,学习它非常的简单,只要你理解了IoC和DI的概念以及在何时需要使用它们
  • XML配置支持
  • 自动装配
  • 与Asp.Net MVC 3集成
  • 微软的Orchad开源程序使用的就是Autofac,从该源码可以看出它的方便和强大

既然它都这么牛X了,我们用它就理所当然了,所以推荐其为IOC的终极解决方案!

二、AutoFac的使用

首先你必须获取AutoFac,这里你可以通过各种方式加载它,我这里还是通过VS中的NuGet来加载AutoFac,不论是哪种方式,最终的目的就是将 Autofac.dll,Autofac.Configuration.dll 这两个程序集引用到你的项目中。这样在你的项目中,如果想使用AutoFac,只需添加其命名空间引用即可~

1、AutoFac入门

我们先定义一个数据访问的接口:

public interface IDAL
{void Insert(string commandText);
}

然后用Sql和Oracle两种方式分别实现上述接口,不过这里只是演示而已,所以并没有真正去实现这两个类,你懂的~

SQL方式:

public class SqlDAL : IDAL
{public void Insert(string commandText){Console.WriteLine("使用sqlDAL添加相关信息");}
}

Oracle方式:

public class OracleDAL : IDAL
{public void Insert(string commandText){Console.WriteLine("使用OracleDAL添加相关信息");}
}

然后注入实现构造函数注入:

public class DBManager
{     IDAL _dal;public DBManager(IDAL dal) { _dal= dal;}
public void Add(string commandText) { _dal.Insert(commandText); }
}

最后要真正完成依赖注入就得AtuoFac登场了:

var builder = new ContainerBuilder();
builder.RegisterType<DBManager>();
builder.RegisterType<SqlDAL>().As<IDAL>();
using (var container = builder.Build())
{ var manager = container.Resolve<DBManager>(); manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')");
}

从以上栗子可以看出,其实AutoFac的使用跟Unity的使用有点像,关键的东东就是这个Container容器类

2、AutoFac常用方法说明

(1)builder.RegisterType<Object>().As<Iobject>():注册类型及其实例。例如下面就是注册接口IDAL的实例SqlDAL

ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<SqlDAL>().As<IDAL>();
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.Resolve<IDAL>();

(2)IContainer.Resolve<IDAL>():解析某个接口的实例。例如上面的最后一行代码就是解析IDAL的实例SqlDAL

(3)builder.RegisterType<Object>().Named<Iobject>(string name):为一个接口注册不同的实例。有时候难免会碰到多个类映射同一个接口,比如SqlDAL和OracleDAL都实现了IDAL接口,为了准确获取想要的类型,就必须在注册时起名字。

builder.RegisterType<SqlDAL>().Named<IDAL>("sql");
builder.RegisterType<OracleDAL>().Named<IDAL>("oracle");
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.ResolveNamed<IDAL>("sql");
OracleDAL oracleDAL = (OracleDAL)container.ResolveNamed<IDAL>("oracle");

(4)IContainer.ResolveNamed<IDAL>(string name):解析某个接口的“命名实例”。例如上面的最后一行代码就是解析IDAL的命名实例OracleDAL

(5)builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以枚举的方式为一个接口注册不同的实例。有时候我们会将某一个接口的不同实现用枚举来区分,而不是字符串,例如:

public enum DBType{ Sql, Oracle}

builder.RegisterType<SqlDAL>().Keyed<IDAL>(DBType.Sql);
builder.RegisterType<OracleDAL>().Keyed<IDAL>(DBType.Oracle);
IContainer container = builder.Build();
SqlDAL sqlDAL = (SqlDAL)container.ResolveKeyed<IDAL>(DBType.Sql);
OracleDAL oracleDAL = (OracleDAL)container.ResolveKeyed<IDAL>(DBType.Oracle);

(6)IContainer.ResolveKeyed<IDAL>(Enum enum):根据枚举值解析某个接口的特定实例。例如上面的最后一行代码就是解析IDAL的特定实例OracleDAL

(7)builder.RegisterType<Worker>().InstancePerDependency():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式

(8)builder.RegisterType<Worker>().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例

(9)IContainer.Resolve<T>(NamedParameter namedParameter):在解析实例T时给其赋值

DBManager manager = container.Resolve<DBManager>(new NamedParameter("name", "SQL"));

public class DBManager
{   IDAL dal;public DBManager (string name,IDAL  _dal){Name = name;dal= _dal;}
}

3、通过配置的方式使用AutoFac

(1)先配置好配置文件

<?xml version="1.0"?><configuration><configSections><section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration"/></configSections><autofac defaultAssembly="ConsoleApplication1"><components><component type="ConsoleApplication1.SqlDAL, ConsoleApplication1" service="ConsoleApplication1.IDAL" /></components></autofac></configuration>

(2)读取配置实现依赖注入(注意引入Autofac.Configuration.dll)

static void Main(string[] args){ContainerBuilder builder = new ContainerBuilder();builder.RegisterType<DBManager>();builder.RegisterModule(new ConfigurationSettingsReader("autofac"));using (IContainer container = builder.Build()){DBManager manager = container.Resolve<DBManager>();manager.Add("INSERT INTO Persons VALUES ('Man', '25', 'WangW', 'Shanghai')"); } 

三、ASP.NET MVC与AtuoFac

终于到了ASP.NET MVC与AtuoFac双剑合璧的时候了,下面就看看AtuoFac在MVC中的应用,其实很简单,大概就几个步骤搞定:

1、首先在函数Application_Start() 注册自己的控制器类,一定要引入Autofac.Integration.Mvc.dll

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Autofac;
using AtuoFacOfMVC4.Models;
using System.Reflection;
using Autofac.Integration.Mvc;namespace AtuoFacOfMVC4
{public class MvcApplication : System.Web.HttpApplication{protected void Application_Start(){var builder = new ContainerBuilder();SetupResolveRules(builder);builder.RegisterControllers(Assembly.GetExecutingAssembly());var container = builder.Build();DependencyResolver.SetResolver(new AutofacDependencyResolver(container));AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);AuthConfig.RegisterAuth();}private void SetupResolveRules(ContainerBuilder builder){builder.RegisterType<StudentRepository>().As<IStudentRepository>();}}
}

2、现在在你的MVC程序中注入依赖代码就ok了

(1)首先声明一个Student学生类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace AtuoFacOfMVC4.Models
{public class Student{public int Id { get; set; }public string Name { get; set; }public string Graduation { get; set; }public string School { get; set; }public string Major { get; set; }}
}

(2)然后声明仓储接口及其实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace AtuoFacOfMVC4.Models
{public interface IStudentRepository{IEnumerable<Student> GetAll();Student Get(int id);Student Add(Student item);bool Update(Student item);bool Delete(int id);}
}

 View Code

(3)最后添加控制器StudentController,并注入依赖代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AtuoFacOfMVC4.Models;namespace AtuoFacOfMVC4.Controllers
{public class StudentController : Controller{readonly IStudentRepository repository;//构造器注入public StudentController(IStudentRepository repository){this.repository = repository;}public ActionResult Index(){var data = repository.GetAll();return View(data);}}
}

(4)最后为控制器StudentController的Index方法添加视图即可,这里不再详述,运行效果如下

郑重声明:本博客仅用于个人整理和总结学习笔记,如有任何疑问欢迎留言!

转载于:https://www.cnblogs.com/0to9/p/6626263.html

ASP.NET MVC IOC 之AutoFac攻略相关推荐

  1. ASP.NET MVC中使用Autofac实现简单依赖注入

    本文参考资料: 1.https://www.cnblogs.com/RayWang/p/11128554.html. 2.https://www.cnblogs.com/eedc/p/6127181. ...

  2. 如何发布.Net MVC 网站项目(攻略集锦)

    转载自诗人江湖老,原文地址 参考文献 既然是攻略,就必然有参考文献,放在文章开头,以示敬意! 1.MVC项目发布步骤 2.未能从程序集加载"System.ServiceModel.Activ ...

  3. ASP.NET MVC 5 使用autofac实现DI

    使用Nuget添加Autofac.MVC的引用 启动项设置 注册Controller 注册ModelBinder 注册相关的web abstraction 为View层启用属性注入 为Action F ...

  4. ASP.NET完整打包卸载更新攻略(By Installshield 2010)【转】

    - 前言 前阵子做了一个有关Installshield的OA 打包安装程序,用的版本Installshield 2010-Premier,具体功能的内容如下: 1.OA采用的是asp.net(C#)开 ...

  5. ASP.NET MVC 简单的分页思想与实现

    首先我们通过VS创建一个空的基于Razor视图引擎的ASP.NET MVC3 Web应用程序,命名为JohnConnor.Web 对创建过程或Razor不太了解的看官,请移步 ASP.NET MVC ...

  6. asp.net mvc fckeditor全攻略(补充:Controller中传值的问题)

    开篇仍然要叙述我的环境 环境说明: 软件环境:asp.net mvc3   +   vs2010 系统环境:windows xp sp3 浏览器: ie8(为了世界的和平,为了社会的稳定,为了不再被大 ...

  7. asp.net mvc Autofac 依赖注入框架 使用

    Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高. 官方网站http://autofac.org/ 源码下载 ...

  8. 想爱容易,相处难:当ASP.NET MVC爱上IoC

    也许你会问ASP.NET MVC为什么会爱上IoC? 相爱的理由常常很简单,就像一首歌中所唱--"只为相遇那一个眼神". 而ASP.NET MVC爱上IoC只为IoC能实现MVC控 ...

  9. ASP.NET MVC的Razor引擎:IoC在View激活过程中的应用

    在<ASP.NET MVC的Razor引擎:RazorView>介绍BuildManagerCompiledView的时候,我们谈到默认使用的ViewPageActivator使用当前注册 ...

最新文章

  1. JavaScript库和API
  2. 说说如何基于 Vue.js 实现表格组件
  3. 【C 语言】字符串模型 ( 字符串翻转模型 | 借助 递归函数操作 逆序字符串操作 | 引入线程安全概念 )
  4. 【采用】干货请收好:终于有人把用户画像的流程、方法讲明白了
  5. linux命令冒号加叹号,Linux中的叹号命令
  6. linux编译openssl
  7. COSCon‘20 参会指南 | 你想知道的都在这里(文末有福利)
  8. python动态时钟代码_python绘制动态时钟
  9. 操作系统中的多级队列调度
  10. springdata学习笔记-01-helloworld-(暂时不全223)
  11. c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序
  12. Android - shape圆形画法(oval)
  13. WINDOWS系统自动登录设置
  14. 看我如何发现开源 WAF引擎ModSecurity 中的DoS 漏洞
  15. 实验总结:Java+oracle数据库实现图书馆管理系统
  16. EasyDataTransform for mac (表格数据转换)
  17. cmake安装使用(详解 )
  18. 虚拟服务器软件 海光,海光校园虚拟服务器管理软件技术参数
  19. 无法使用tftp下载Linux内核到开发板,总是显示TTTTTTTTT的原因
  20. Selenium隐藏“Chrome is being controlled by automated test software”

热门文章

  1. js 关键字 in 的使用方法
  2. CSS属性中Display与Visibility
  3. HTML DOM 节点
  4. Django静态文件配置
  5. hadoop1.2.1伪分布模式配置
  6. 图结构练习——DFS——判断可达性
  7. rewind和fseek
  8. Fatfs文件系所有函数总结
  9. java- 和 || 优先级的问题
  10. c一:指针引用(int * p )和指针(int * q)的区别