ASP.NET MVC IOC 之AutoFac攻略

一、为什么使用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);}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace AtuoFacOfMVC4.Models
{public class StudentRepository : IStudentRepository{private List<Student> Articles = new List<Student>();public StudentRepository(){//添加演示数据Add(new Student { Id = 1, Name = "张三", Major = "软件工程", Graduation = "2013年", School = "西安工业大学" });Add(new Student { Id = 2, Name = "李四", Major = "计算机科学与技术", Graduation = "2013年", School = "西安工业大学" });Add(new Student { Id = 3, Name = "王五", Major = "自动化", Graduation = "2013年", School = "西安工业大学" });}/// <summary>/// 获取全部学生信息/// </summary>/// <returns></returns>public IEnumerable<Student> GetAll(){return Articles;}/// <summary>/// 通过ID获取学生信息/// </summary>/// <param name="id"></param>/// <returns></returns>public Student Get(int id){return Articles.Find(p => p.Id == id);}/// <summary>/// 添加学生信息/// </summary>/// <param name="item"></param>/// <returns></returns>public Student Add(Student item){if (item == null){throw new ArgumentNullException("item");}Articles.Add(item);return item;}/// <summary>/// 更新学生信息/// </summary>/// <param name="item"></param>/// <returns></returns>public bool Update(Student item){if (item == null){throw new ArgumentNullException("item");}int index = Articles.FindIndex(p => p.Id == item.Id);if (index == -1){return false;}Articles.RemoveAt(index);Articles.Add(item);return true;}/// <summary>/// 删除学生信息/// </summary>/// <param name="id"></param>/// <returns></returns>public bool Delete(int id){Articles.RemoveAll(p => p.Id == id);return true;}}
}
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/WeiGe/p/3871451.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android对话框跳转页面,android应用Dialog跳转到Activity

Java基础-四要素之一《多态》什么是多态 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式.(发送消息就是函数调用) 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的 ...java进制转换器 图形用户界面 十进…

apache cxf_Apache CXF负载平衡和故障转移

apache cxf不久前&#xff0c;我们已经面临了基于Apache CXF的负载平衡Web服务客户端的需求。 此外&#xff0c;当某些服务器关闭时&#xff0c;客户端应自动进行故障转移。 更糟糕的是&#xff0c;服务器目标地址列表要从外部服务获取并在运行时更新。 最终&#xff0c;我们最…

HDU 1874 最直接的最短路径问题

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1874 Problem Description某省自从实行了很多年的畅通工程计划后&#xff0c;终于修建了很多路。不过路多了也不好&#xff0c;每次要从一个城镇到另一个城镇时&#xff0c;都有许多种道路方案可以选择&#xf…

晶体管

晶体管-沟道 场效应-电容性的控制沟道 势效应-直接控制沟道 平带电压 由于半导体和金属的功函数的不同&#xff0c;导致半导体表面层并不属于平带状态&#xff0c;为了恢复平带状态所加的电压为平带电压&#xff0c;Vfb 转载于:https://www.cnblogs.com/rice808/p/3874597.html…

领域驱动设计模式设计与实践_在域驱动设计中使用状态模式

领域驱动设计模式设计与实践域驱动设计&#xff08;DDD&#xff09;是一种开发软件的方法&#xff0c;其中&#xff0c;通过将实现与核心业务概念的不断发展的模型相联系&#xff0c;解决了问题的复杂性。 该术语是由Eric Evans创造的&#xff0c;并且有一个DDD专用站点可以促进…

html 英文文字纵向排列,CSS几种简单方法实现文字竖向排版

1.一个句子的竖向排列如图&#xff1a;1.2. test.one {width: 20px;margin: 0 auto;line-height: 24px;font-size: 20px;}.two {width: 15px;margin: 0 auto;line-height: 24px;font-size: 20px;word-wrap: break-word;/*英文的时候需要加上这句&#xff0c;自动换行*/}我是竖列…

jstree 节点拖拽保存数据库

需要jstree具有拖拽功能需要在加载jstree时添加dnd插件&#xff0c;具体看代码&#xff1a; $(**).jstree({//plugins-各种jstree的插件引入&#xff0c;展示树的多样性 plugins : [ "dnd", "types", "wholerow" ], core : {"check_callbac…

html js utf8编码转换,js 编码转换 gb2312 和 utf8 互转的2种方法

方法一:function gb2utf8(data){var glbEncode [];gb2utf8_data data;execScript("gb2utf8_data MidB(gb2utf8_data, 1)", "VBScript");var tescape(gb2utf8_data).replace(/%u/g,"").replace(/(.{2})(.{2})/g,"%$2%$1").replace(/…

向其他进程注入代码的三种方法

如何向其他线程的地址空间中注入代码并在这个线程的上下文中执行之&#xff1f; 目录&#xff1a;●导言●Windows 钩子&#xff08;Hooks&#xff09;●CreateRemoteThread 和LoadLibrary 技术○进程间通讯●CreateRemoteThread 和 WriteProcessmemory 技术○如何使用该技术子…

自动添加html结束标志,HTML:包含或排除可选的结束标记?

MYYA我在这里添加一些链接来帮助您了解HTML的历史&#xff0c;以便您了解各种矛盾。这不是你的问题的答案&#xff0c;但在阅读这些各种摘要后你会知道更多。我们是怎么来到这里的&#xff1f; - 潜入HTML5网络历史HTML简史HTML的历史 - HTML WG WikiDive Into HTML5的一些摘录…

JAR清单类路径不仅适用于Java Application Launcher

自从我开始学习Java以来​​&#xff0c;我几乎已经知道&#xff0c; 清单文件中的Class-Path标头字段为可执行JAR &#xff08;具有由另一个称为Main-Class清单指定应用程序起点的 JAR&#xff09;指定相对运行时类路径。 一个同事最近碰到一个让我感到惊讶&#xff0c;因为它…

[原创]ActionScript3游戏中的图像编程(连载五)

总目录&#xff1a;http://www.cnblogs.com/iloveas/p/3879125.html 1.1.2 Flash中的ARGB模式与不透明度的关系 ARGB是Flash&#xff0c;svg等矢量处理软件特有的一种色彩模式&#xff0c;事实上我觉得它有点扯淡&#xff0c;A&#xff08;alpha&#xff09;不应该作为一个通道…

通过url,获取html内容,并解析,如何使用 JavaScript 解析 URL

在 Web 开发中&#xff0c;有许多情况需要解析 URL&#xff0c;这篇主要学习如何使用 URL 对象实现这一点。开始创建一个以下内容的 HTML 文件&#xff0c;并在浏览器中打开。JavaScript URL parsing// 激动人心的代码即将写在这里如果你想尝试本文中的任何内容&#xff0c;可以…

define 汉字 error C2001: newline in constant

这个问题真的很让我头大&#xff0c;搜了很多办法都不行&#xff0c;问题是我之前也遇到过&#xff0c;但是编码转为utf-8 unsignature就行了&#xff0c;这次把编码从gb转为utf-8 unsignature 却不行。于是想看看cocos2d-x库文件的编码格式&#xff0c;发现用的是utf-8&#x…

solaris安装java_Solaris是出色的Java开发平台的原因

solaris安装java几天前&#xff0c;我发布了“ OpenSolaris的死亡&#xff1a;为Java开发人员选择操作系统 ”&#xff0c;其中我说Solaris是Java开发人员的绝佳平台。 这篇文章的重点只是想知道自OpenSolaris淘汰以来我将使用哪个Solaris版本。 正如Neil的评论使我意识到的那样…

正确使用计算机说课稿,《计算机结构原理初步》说课稿

在教师招聘考试的过程中&#xff0c;高中信息说课稿的难度就在于如何处理理论与实践的关系&#xff0c;希望这篇《计算机结构原理初步》说课稿能给予你帮助。各位考官大家好!我是号考生&#xff0c;今天我说课的题目是《计算机结构原理初步》。现代教学理论认为&#xff0c;在教…

stringstream实例

stringstream的具体作用稍后来总结&#xff0c;这里分享一个实例&#xff0c;从txt文档中读取数据&#xff0c;并对进行处理。 #include <iostream> #include <sstream> //stringstream的头文件 #include <fstream> #include <vector> #include <s…

计算机2013知识,2013年全国计算机一级考试B基本知识点五

基础5单元格操作对已建立的工作表&#xff0c;根据需要可以编辑修改其中的数据首先要移动单元格指针到目的地或选定编辑对象&#xff0c;然后才能进行增、删、改操作。1.单元格指针的移动要编辑某单元格&#xff0c;必须把单元格指针移动到该单元格&#xff0c;使之成为当前单元…

两种解决IE6不支持固定定位的方法

有两种让IE6支持position:fixed1.用CSS执行表达式 *{margin:0;padding:0;} * html,* html body{ background-image:url(about:blank);background-attachment:fixed; } * html .fixed{position:absolute;bottom:auto;top:expression(eval(document.documentElement.scrollTopdoc…

smartgwt_高级SmartGWT教程,第1部分

smartgwt贾斯汀&#xff08;Justin&#xff09;&#xff0c;帕特&#xff08;Pat&#xff09;和我已经开始着手进行一个需要管理和管理用户界面的副项目。 在与SmartGWT和GWT共同工作了一段时间之后&#xff0c;我们决定使用SmartGWT创建接口。 我们非常喜欢视觉组件&#xff0…