Asp.Net MVC 之 Autofac 初步使用3 整合web api
阿新 • • 發佈:2019-01-30
今天我們試著在WebApi2實現autofac的注入,關於這方面也是看了幾位園友的分享省了不少時間,所以結合著前篇的demo再新建webapi進行...
demo3下載地址: http://pan.baidu.com/s/1eSCAZtC
一樣開篇還是發下大概demo結構:
還是nuget安裝 Autofac 以及 Autofac ASP.NET MVC 5 Integration 、Autofac ASP.NET WEB API 2.2 Integration
看到有園友說屬性注入存在安全隱患,官方的建議是使用建構函式注入。
特意找了一下相關的內容,不過不確定觀點是否正確,有明白的朋友麻煩可以告知下,我也好補充下讓更多朋友明白哈,在此感謝。
優缺點:
1. 屬性注入直白易懂,缺點是對於屬性可選的時候,很多個建構函式會顯得類很臃腫。
2. 構造注入是一種高內聚的體現,特別是針對有些屬性需要在物件在建立時候賦值,且後續不允許修改(不提供setter方法)。
不囉嗦了,主要還是貼下WebApi2的Global檔案,裡面主要關注關於mvc與webapi註冊的地兒(紅色部分)
#region 自動注入 //建立autofac管理註冊類的容器例項 var builder = new ContainerBuilder(); HttpConfiguration config= GlobalConfiguration.Configuration; Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray(); //註冊所有實現了 IDependency 介面的型別 Type baseType = typeof(IDependency); builder.RegisterAssemblyTypes(assemblies) .Where(type=> baseType.IsAssignableFrom(type) && !type.IsAbstract) .AsSelf().AsImplementedInterfaces() .PropertiesAutowired().InstancePerLifetimeScope(); //註冊MVC型別 // builder.RegisterControllers(assemblies).PropertiesAutowired(); //註冊Api型別 builder.RegisterApiControllers(assemblies).PropertiesAutowired(); //builder.RegisterFilterProvider(); builder.RegisterWebApiFilterProvider(config); var container = builder.Build(); //註冊api容器需要使用HttpConfiguration物件 config.DependencyResolver = new AutofacWebApiDependencyResolver(container); //註冊解析 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); #endregion
新新增 TestController
[RoutePrefix("api/Test")] public class TestController : ApiController { readonly IUserRepository repository; //構造器注入 public TestController(IUserRepository repository) { this.repository = repository; } [HttpGet] public HttpResponseMessage Index() { return MessageToJson.ToJson(repository.GetAll()); } }
MessageToJson 只是把結果轉了一下json
//需新增 System.Web.Extensions.dll 引用 public static HttpResponseMessage ToJson(Object obj) { String str; if (obj is String || obj is Char) { str = obj.ToString(); } else { var serializer = new JavaScriptSerializer(); str = serializer.Serialize(obj); } var result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") }; return result; }
最後來測試下結果:
訪問/api/Test/Index