转载

[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.浏览器访问~/

[Solution] 使用Autofac在MVC、Web API、WCF中实现IOC

结合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

[Solution] 使用Autofac在MVC、Web API、WCF中实现IOC

结合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

[Solution] 使用Autofac在MVC、Web API、WCF中实现IOC

惭愧,好久没发博客了

正文到此结束
Loading...