webapi框架搭建-依赖注入之autofac
前言
c#的依赖注入框架有unity、autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入autofac功能。
前面我们已经搭建好webapi,并用了owin技术。这篇的autofac也将基于这两种技术进行开发。
步骤
引入包
using System.Reflection; using Autofac; using Autofac.Integration.WebApi; using webapi.example; namespace webapi.AutoFac { public static class ContainerBuilerCommon { public static IContainer GetWebApiContainer() { var builder = new ContainerBuilder();
// 注册webapi的所有控制器 builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// 注册一个用于测试的组件。 builder.RegisterType<Chinese>().As<People>(); return builder.Build(); } } }
除了builder.RegisterApiControllers(Assembly.GetExecutingAssembly())是注册webapi控制器,其它所有的代码都是autofac本身的用法。
autofac的用法可总结为三步:
1、创建container builder
var builder = new ContainerBuilder();
autofac怎么注册组件可以参考官网:http://autofac.readthedocs.io/en/latest/register/registration.html
3、生成依赖注入容器(如果是webapi则将容器传给webapi的DependencyResolver对象)
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
用于测试的people接口和两个接口的实现类如下
public interface People { string Language(); } public class Chinese : People { public string Language() { return "汉语"; } } public class American:People { public string Language() { return "english"; } }
owin管道配置
public class Startup { /// <summary> /// owin的http请求管道配置函数 /// </summary> /// <param name="app"></param> public void Configuration(IAppBuilder app) { #region 写在前面的配置 // 获取webapi的配置 var config = WebApiConfig.OwinWebApiConfiguration(new HttpConfiguration()); // 获取webapi的依赖注入容器 var container = ContainerBuilerCommon.GetWebApiContainer(); // 配置webapi的依赖注入 config.DependencyResolver = new AutofacWebApiDependencyResolver(container); #endregion #region owin组件注册(要注意顺序) app.UseAutofacMiddleware(container);// 先注册autofac组件,需要依赖注入功能的组件在此后注册 app.UseAutofacWebApi(config);//注册AutofacWebApi组件后再注册WebApi组件 app.UseWebApi(config); #endregion }
WebApiConfig类代码如下(非核心代码)
using System.Web.Http; namespace webapi.Configs { /// <summary> /// webapi 配置类 /// </summary> public static class WebApiConfig { /// <summary> /// 返回webapi的httpconfiguration配置 /// 用于webapi应用于owin技术时使用 /// </summary> /// <returns></returns> public static HttpConfiguration OwinWebApiConfiguration(HttpConfiguration config) { config.MapHttpAttributeRoutes();//开启属性路由 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); return config; } } }
测试依赖注入是否正常
创建IOCTestController控制器
/// <summary> /// 本代码用来测试依赖注入是否正常 /// </summary> namespace webapi.example { public class IOCTestController : ApiController { private People _people; public IOCTestController(People people) { _people = people; } public IHttpActionResult GetLanguage() { return Ok(_people.Language()); } } }
注意:控制器里的_people没有用new的方法去创建,而是交给了控制器的构造函数,并且控制器的创建已经配置成由autofac进行依赖注入,如下代码
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
所以autofac会在创建IOCTestController时用Chinese代替接口people
builder.RegisterType<Chinese>().As<People>();
测试结果如下: