当前位置: 首页 > 科技观察

ASP.NETMVCIOCAutoFac攻略

时间:2023-03-11 23:50:50 科技观察

1.为什么要用AutoFac?之前介绍过Unity和Ninject这两个IOC容器,但是发现园子里好像AutoFac比较常见,于是折腾了两天,发现这玩意确实是个高大上的IOC容器~Autofac是.NET领域的IOC框架之一,据说是最快的:优点:与C#语言密切相关,这意味着C#中的很多编程方法都可以用于Autofac,比如可以使用Lambda表达式注册组件降低学习曲线,学习起来很简单,只要了解IoC和DI的概念以及什么时候需要使用它们XML配置支持自动组装和与Asp.NetMVC集成3微软的Orchad开源程序使用Autofac,从中可以看出它的方便和强大,既然这么牛逼,我们用它也是理所当然的事,所以推荐它作为IOC的终极解决方案!2.AutoFac的使用首先,你必须获得AutoFac。您可以在此处以各种方式加载它。我仍然通过VS中的NuGet加载AutoFac。无论使用哪种方法,最终目的都是为了使用Autofac.dll,即Autofac。Configuration.dll这两个程序集被引用到您的项目中。这样,在你的项目中,如果要使用AutoFac,只需要添加它的命名空间reference~1。要开始使用AutoFac,我们首先定义一个数据访问接口:publicinterfaceIDAL{voidInsert(stringcommandText);分别实现以上接口的方法,不过这里只是演示,所以这两个类并没有真正实现,你懂的~SQL方法:publicclassSqlDAL:IDAL{publicvoidInsert(stringcommandText){Console.WriteLine("使用sqlDAL添加相关信息");}}Oracle方法:publicclassOracleDAL:IDAL{publicvoidInsert(stringcommandText){Console.WriteLine("使用OracleDAL添加相关信息");}}然后注入实现构造函数注入:publicclassDBManager{IDAL_dal;publicDBManager(IDALdal){_dal=dal;}publicvoidAdd(stringcommandText){_dal.Insert(commandText);要真正完成依赖注入,AtuoFac还得登场:varbuilder=newContainerBuilder();builder.RegisterType();builder.RegisterType().As();使用(varcontainer=builder.Build()){varmanager=container.Resolve();manager.Add("INSERTINTOPersonsVALUES('男人','25','WangW','上海')");}从上面的栗子可以看出,其实AutoFac的使用有点类似于Unity的使用,关键是Container容器类2、AutoFac常用方法说明(一)builder.RegisterType().As():注册类型及其实例。例如下面是注册接口IDAL的实例SqlDALContainerBuilderbuilder=newContainerBuilder();builder.RegisterType().As();IContainercontainer=builder.Build();SqlDALsqlDAL=(SqlDAL)container.Resolve();(2)IContainer.Resolve():解析一个接口的实例。比如上面最后一行代码是解析IDAL实例SqlDAL(3)builder.RegisterType().Named(stringname):为一个接口注册不同的实例。有时多个类映射到同一个接口是不可避免的。例如,SqlDAL和OracleDAL都实现了IDAL接口。为了准确获取到你想要的类型,你必须在注册的时候给它命名。builder.RegisterType().Named("sql");builder.RegisterType().Named("oracle");IContainercontainer=builder.Build();SqlDALsqlDAL=(SqlDAL)container.ResolveNamed("sql");OracleDALoracleDAL=(OracleDAL)container.ResolveNamed("oracle");(4)IContainer.ResolveNamed(stringname):解析“命名实例”。比如上面最后一行代码是解析IDALOracleDAL的命名实例(5)builder.RegisterType().Keyed(Enumenum):通过枚举的方式为一个接口注册不同的实例。有时我们用枚举而不是字符串来区分接口的不同实现,例如:publicenumDBType{Sql,Oracle}builder.RegisterType().Keyed(DBType.Sql);建造者.RegisterType().Keyed(DBType.Oracle);IContainercontainer=builder.Build();SqlDALsqlDAL=(SqlDAL)容器.ResolveKeyed(DBType.Sql);OracleDALoracleDAL=(OracleDAL)container.ResolveKeyed(DBType.Oracle);(6)IContainer.ResolveKeyed(Enumenum):根据具体实例的枚举值解析一个接口。比如上面最后一行代码是解析IDALOracleDAL的具体实例(7)builder.RegisterType().InstancePerDependency():用来控制对象的生命周期,每次加载一个实例,创建一个新的实例,默认是Thismethod(8)builder.RegisterType().SingleInstance():用于控制对象的生命周期,每次加载实例返回同一个实例(9)IContainer.Resolve(NamedParameternamedParameter):解析实例T时,赋值DBManagermanager=container.Resolve(newNamedParameter("name","SQL"));publicclassDBManager{IDALdal;publicDBManager(stringname,IDAL_dal){名称=名称;dal=_dal;}}3。通过配置使用AutoFac(1)首先配置配置文件                  (2)读取配置实现依赖注入(注意Autofac.Configuration.dll的引入)staticvoidMain(string[]args){ContainerBuilderbuilder=newContainerBuilder();builder.RegisterType();builder.RegisterModule(newConfigurationSettingsReader("autofac"));使用(IContainercontainer=builder.Build()){DBManagermanager=container.Resolve();manager.Add("INSERTINTOPersonsVALUES('男人','25','WangW','上海')");}#p#第三,ASP.NETMVC和AtuoFac终于到了ASP.NETMVC和AtuoFac剑拔弩张的时候了。下面来看看AtuoFac在MVC中的应用。其实很简单,大概几步就搞定了:1.首先在函数Application_Start()中注册自己的controller类,一定要引入Autofac.Integration.Mvc.dllusingSystem;使用System.Collections.Generic;使用System.Linq;使用System.Web;使用System.Web.Http;使用System.Web.Mvc;使用System.Web.Optimization;使用System.Web.Routing;使用Autofac;使用AtuoFacOfMVC4.Models;使用System.Reflection;使用Autofac.Integration.Mvc;protectedvoidApplication_Start(){varbuilder=newContainerBuilder();SetupResolveRules(建造者);builder.RegisterControllers(Assembly.GetExecutingAssembly());varcontainer=builder.Build();DependencyResolver.SetResolver(newAutofacDependencyResolver(容器));AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);BundleConfig.RegisterBundles(BundleTable.Bundles);AuthConfig.RegisterAuth();}privatevoidSetupResolveRules(ContainerBuilderbuilder){builder.RegisterType().As();}}}2、现在在你的MVC程序中注册依赖代码就ok了(1)首先声明一个Student学生类usingSystem;使用System.Collections.Generic;使用System.Linq;使用System.Web;namespaceAtuoFacOfMVC4.Models{publicclassStudent{publicintId{get;set;}publicstringName{get;set;}publicstringGraduation{get;set;}publicstringSchool{get;set;}publicstringMajor{get;set;}}}(2)然后声明存储接口及其实现usingSystem;使用System.Collections.Generic;使用System.Linq;使用系统文本;namespaceAtuoFacOfMVC4.Models{publicinterfaceIStudentRepository{IEnumerableGetAll();StudentGet(完整);学生添加(学生项目);boolUpdate(学生项目);布尔删除(intid);}}使用系统;使用System.Collections.Generic;使用System.Linq;{privateListArticles=newList();publicStudentRepository(){//添加演示数据Add(newStudent{Id=1,Name="张三",Major="软件工程",Graduation="2013",School="西安工业大学"});Add(newStudent{Id=2,Name="李思",Major="计算机科学与技术",Graduation="2013",School="西安工业大学"});Add(newStudent{Id=3,Name="王武",Major="自动化",Graduation="2013",School="西安工业大学"});}//////获取所有学生信息//////publicIEnumerableGetAll(){returnArticles;}//////通过ID获取学生信息/////////publicStudentGet(intid){returnArticles.Find(p=>p.Id==id);}//////添加学生信息/////////publicStudentAdd(Studentitem){if(item==null){thrownewArgumentNullException("item");}文章。添加(项目);归还物品;}//////更新学生信息/////////publicboolUpdate(Studentitem){如果(item==null){thrownewArgumentNullException(“item”);}intindex=Articles.FindIndex(p=>p.Id==item.Id);如果(索引==-1){返回假;}文章.RemoveAt(指数);文章。添加(项目);返回真;}//////删除学生信息/////////publicboolDelete(intid){Articles.RemoveAll(p=>p.Id==id);返回真;}}}(3)最后添加控制器StudentController,注入依赖代码usingSystem;使用System.Collections。通用的;使用System.Linq;使用System.Web;使用System.Web.Mvc;使用AtuoFacOfMVC4.Models;namespaceAtuoFacOfMVC4.Controllers{publicclassStudentController:Controller{readonlyIStudentRepositoryrepository;//构建器注册publicStudentController(IStudentRepositoryrepository){this.repository=repository;}publicActionResultIndex(){vardata=repository.GetAll();返回视图(数据);}}}(4)最后在controllerStudentController的Index方法中添加view即可,这里不再赘述,运行效果如下分享一下,既可以帮助自己成长,也可以帮助别人偶尔,为什么不这样做呢?如果这篇文章对你还有用,希望能帮到你推荐~原文链接:http://www.cnblogs.com/WeiGe/p/3871451.html