做网站 包含详情页设计吗,深圳住房建设局网站,免费网站模板 带后台,开发手机网站步骤一、为什么使用AutoFac#xff1f; 之前介绍了Unity和Ninject两个IOC容器#xff0c;但是发现园子里用AutoFac的貌似更为普遍#xff0c;于是捯饬了两天#xff0c;发现这个东东确实是个高大上的IOC容器~ Autofac是.NET领域最为流行的IOC框架之一#xff0c;传说是速度最快… 一、为什么使用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.dllAutofac.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.RegisterTypeDBManager();
builder.RegisterTypeSqlDAL().AsIDAL();
using (var container builder.Build())
{ var manager container.ResolveDBManager(); manager.Add(INSERT INTO Persons VALUES (Man, 25, WangW, Shanghai));
} 从以上栗子可以看出其实AutoFac的使用跟Unity的使用有点像关键的东东就是这个Container容器类 2、AutoFac常用方法说明 1builder.RegisterTypeObject().AsIobject()注册类型及其实例。例如下面就是注册接口IDAL的实例SqlDAL ContainerBuilder builder new ContainerBuilder();
builder.RegisterTypeSqlDAL().AsIDAL();
IContainer container builder.Build();
SqlDAL sqlDAL (SqlDAL)container.ResolveIDAL(); 2IContainer.ResolveIDAL()解析某个接口的实例。例如上面的最后一行代码就是解析IDAL的实例SqlDAL 3builder.RegisterTypeObject().NamedIobject(string name)为一个接口注册不同的实例。有时候难免会碰到多个类映射同一个接口比如SqlDAL和OracleDAL都实现了IDAL接口为了准确获取想要的类型就必须在注册时起名字。 builder.RegisterTypeSqlDAL().NamedIDAL(sql);
builder.RegisterTypeOracleDAL().NamedIDAL(oracle);
IContainer container builder.Build();
SqlDAL sqlDAL (SqlDAL)container.ResolveNamedIDAL(sql);
OracleDAL oracleDAL (OracleDAL)container.ResolveNamedIDAL(oracle); 4IContainer.ResolveNamedIDAL(string name):解析某个接口的“命名实例”。例如上面的最后一行代码就是解析IDAL的命名实例OracleDAL 5builder.RegisterTypeObject().KeyedIobject(Enum enum)以枚举的方式为一个接口注册不同的实例。有时候我们会将某一个接口的不同实现用枚举来区分而不是字符串例如 public enum DBType{ Sql, Oracle} builder.RegisterTypeSqlDAL().KeyedIDAL(DBType.Sql);
builder.RegisterTypeOracleDAL().KeyedIDAL(DBType.Oracle); IContainer container builder.Build(); SqlDAL sqlDAL (SqlDAL)container.ResolveKeyedIDAL(DBType.Sql); OracleDAL oracleDAL (OracleDAL)container.ResolveKeyedIDAL(DBType.Oracle); 6IContainer.ResolveKeyedIDAL(Enum enum):根据枚举值解析某个接口的特定实例。例如上面的最后一行代码就是解析IDAL的特定实例OracleDAL 7builder.RegisterTypeWorker().InstancePerDependency()用于控制对象的生命周期每次加载实例时都是新建一个实例默认就是这种方式 8builder.RegisterTypeWorker().SingleInstance()用于控制对象的生命周期每次加载实例时都是返回同一个实例 9IContainer.ResolveT(NamedParameter namedParameter):在解析实例T时给其赋值 DBManager manager container.ResolveDBManager(new NamedParameter(name, SQL)); public class DBManager
{ IDAL dal;public DBManager (string name,IDAL _dal){Name name;dal _dal;}
} 3、通过配置的方式使用AutoFac 1先配置好配置文件 ?xml version1.0?configurationconfigSectionssection nameautofac typeAutofac.Configuration.SectionHandler, Autofac.Configuration//configSectionsautofac defaultAssemblyConsoleApplication1componentscomponent typeConsoleApplication1.SqlDAL, ConsoleApplication1 serviceConsoleApplication1.IDAL //components/autofac/configuration 2读取配置实现依赖注入注意引入Autofac.Configuration.dll static void Main(string[] args){ContainerBuilder builder new ContainerBuilder();builder.RegisterTypeDBManager();builder.RegisterModule(new ConfigurationSettingsReader(autofac));using (IContainer container builder.Build()){DBManager manager container.ResolveDBManager();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.RegisterTypeStudentRepository().AsIStudentRepository();}}
} 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{IEnumerableStudent 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 ListStudent Articles new ListStudent();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/returnspublic IEnumerableStudent GetAll(){return Articles;}/// summary/// 通过ID获取学生信息/// /summary/// param nameid/param/// returns/returnspublic Student Get(int id){return Articles.Find(p p.Id id);}/// summary/// 添加学生信息/// /summary/// param nameitem/param/// returns/returnspublic Student Add(Student item){if (item null){throw new ArgumentNullException(item);}Articles.Add(item);return item;}/// summary/// 更新学生信息/// /summary/// param nameitem/param/// returns/returnspublic 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 nameid/param/// returns/returnspublic 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