你的位置:首页 > ASP.net教程

[ASP.net教程][Solution] 使用Autofac在MVC、Web API、WCF中实现IOC


本来想聊一下面试过程的,1个星期面了6家,4家当场给offer,2家技术通过(1家没下文,1家复试).从中也学习到一些东西,先还是继续Coding吧.

 

官网:http://autofac.org/

下载:Install-Package Autofac -Version 3.5.2

 

Autofac是轻量级的开源IOC容器,传说是速度最快的一个,同类的框架还有用过Castle Windsor、StructureMap、Unity、Spring.Net等.

 

本节目录

  • Hello World
  • 注入高级对象
  • 读取配置文件注入
  • 结合ASP.NET MVC
  • 结合ASP.NET Web API
  • 结合WCF

 

Hello World

1.建立项目

CA:一个控制台项目,引用Nuget Autofac包.

 

2.建立一个依赖外部的类

  public class Test  {    public Test(string str)    {      Console.WriteLine("hello " + str);    }  }

 

3.根据参数名直接注入

static void Main(string[] args){
  //创建容器工厂 var builder = new ContainerBuilder(); //注册Test类型到工厂中 builder.RegisterType<Test>();
  //通过工厂创建容器 using (var container = builder.Build()) {
    //解析Test并返回Test实例 container.Resolve<Test>(new NamedParameter("str", "world")); } Console.ReadKey();}

 

过程:首先需要创建容器工厂,然后将各种类型注册到工厂中,再创建容器,通过容器实例化对象.

 

注入高级对象

添加1个构造函数

public Test(ISay say){  Console.WriteLine("say:" + say.Get());}

 

接口及其实现

  public class Say : ISay  {    public string Get()    {      return "hello world";    }  }  public interface ISay  {    string Get();  }

 

注入实现(Autofac会自动装配)

    static void Main(string[] args)    {      var builder = new ContainerBuilder();      builder.RegisterType<Test>();      builder.RegisterType<Say>().As<ISay>();      using (var container = builder.Build())      {        container.Resolve<Test>();      }      Console.ReadKey();    }

 

略作修改

     public Test(Say say)//将接口改为指定具体实现类    {      Console.WriteLine("say:" + say.Get());    }

 

此时运行代码会报错,因为在容器中我们只注册了ISay接口.改为As<Say>或以下方式

builder.RegisterType<Say>().As<ISay>().AsSelf();

 

 

对象生命周期

注册到工厂的类型默认都调用InstancePerDependency方法.实现每个依赖都创建1个新实例

单例模式:

      builder.RegisterType<Test>().SingleInstance();

 

 

读取配置文件注入

需要引用Nuget Autofac.Configuration包

注册类型代码

builder.RegisterModule(new ConfigurationSettingsReader("autofac"));

 

App.config

 <configSections>  <section name="autofac" type="Autofac.Configuration.SectionHandler, Autofac.Configuration" /> </configSections> <autofac defaultAssembly="CA">  <components>   <component type="CA.Say, CA" service="CA.ISay" />   <component type="CA.Say, CA" service="CA.Say" />  </components> </autofac>

service相当于As<T>中的T

 

 

 

 

结合ASP.NET MVC

1.Install-Package Autofac.Mvc5

2.Application_Start事件添加此方法

    protected void Application_Start(object sender, EventArgs e)    {      #region 1.MVC Autofac注入      var builder = new ContainerBuilder();      //类名.EndsWith("Controller")      builder.RegisterControllers(Assembly.GetExecutingAssembly());      //这样既支持接口 又支持自己的类型      builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())        .AsImplementedInterfaces().AsSelf();      //容器      var container = builder.Build();      //注入改为Autofac注入      DependencyResolver.SetResolver(new AutofacDependencyResolver(container));      #endregion      #region 2.注册MVC路由      var routes = RouteTable.Routes;      routes.MapRoute(        name: "Default",        url: "{controller}/{action}/{id}",        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }      );      #endregion    }

3.带参数的控制器构造函数

  public class HomeController : Controller  {    public HomeController(Say say)    {          }    public string Index()    {      return "Hello World";    }  }  public class Say  {    public string Get()    {      return "Hello World";    }  }

4.浏览器访问~/

 

 

结合ASP.NET Web API

1.Install-Package Autofac.WebApi

2.由于WebAPI需要,引用系统自带Web.Http和Web.Http.WebHost

3.Application_Start添加此方法

    protected void Application_Start(object sender, EventArgs e)    {      var configuration = GlobalConfiguration.Configuration;      #region Autofac WebAPI注入      var builder = new ContainerBuilder();      builder.RegisterApiControllers(Assembly.GetExecutingAssembly());      builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();      var container = builder.Build();      configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);       #endregion      #region 注册Web API路由      configuration.Routes.MapHttpRoute(           name: "DefaultApi",           routeTemplate: "api/{controller}/{id}",           defaults: new { id = RouteParameter.Optional });       #endregion    }

4.带参数的控制器构造函数

  public class ValuesController : ApiController  {    public ValuesController(Say say)    {          }    public string Get()    {      return "Hello World";    }  }  public class Say  {    public string Get()    {      return "Hello World";    }  }

5.浏览器访问~/api/values

 

 

结合WCF

1.Install-Package Autofac.Wcf

2.Application_Start添加此方法

    protected void Application_Start(object sender, EventArgs e)    {      #region WCF Autofac注入      var builder = new ContainerBuilder();      builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces().AsSelf();      var container = builder.Build();      //WCF IOC容器      AutofacHostFactory.Container = container;       #endregion    }

 

3.新建svc服务

  public class TestService : ITestService  {    public TestService(Say say)    {    }    public string DoWork()    {      return "Hello World";    }  }  public class Say  {    public string Get()    {      return "Hello World";    }  }  [ServiceContract]  public interface ITestService  {    [OperationContract]    string DoWork();  }

 

4.svc指令中加一句:

Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" 

 

5.wcftestclient

 

惭愧,好久没发博客了