在之前的項目中用來解耦的使用的輕型IOC框架是unity,它的使用也是很方便的提供在之前的文章的也提到過它的使用方式,但是使用久了之后發現了它的不足之處就是需要配置xml文件來對應的接口和實現的關系??傆X這種不夠靈活。因為隨著項目的進行需要配置的接口和實現會越來越多。配置起來很是麻煩還容易出錯。我在想有沒有別的IOC框架能夠一勞永逸的實現解耦而不是通過配置呢。
答案是肯定的。 那就是autofac ,這是我在Github 上找到的輕型的IOC框架。它的使用方式也特別的簡單。原理呢簡單來說。是通過遍歷程序集來實現的(PS:當然它也是支持通過配置文件來實現的這里我就不詳細說了)。詳細的信息呢大家可以輕易autofac 的官網下載源碼來看。網址是http://autofac.org/ 它的最大特色呢就是約定實現。什么是約定實現。意思就是說你的接口和現實之間需要一個默認的約定。就跟創建控制器一樣必須以controller來結尾一樣。
下面我就直接貼代碼了這個是我做的一個dome 是在在MVC5 webapi 中實現的注入
當然在是用之前你需要在安裝幾個包。直接nuget就行了一共需要三個包
按順序說明下
step1PM> Install-Package Autofac -Version 3.5.0 直接在包管理里面輸入這個命令 nuget地址是https://www.nuget.org/packages/Autofac/3.5.0
step2PM> Install-Package Autofac.Mvc5 添加這個包 nuget地址是https://www.nuget.org/packages/Autofac.Mvc5/
step3PM> Install-Package Autofac.WebApi 最后是添加autofac webapi的包https://www.nuget.org/packages/Autofac.WebApi/

using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Web;using System.Web.Http;using System.Web.Mvc;using Autofac;using Autofac.Integration.Mvc;using Autofac.Integration.WebApi;namespace WebApiIoc.App_Start{ public static class autofaconfig { public static void Initialize(HttpConfiguration config) { Initialize(config, RegisterServices(new ContainerBuilder()));//初始化容器 } public static void Initialize(HttpConfiguration config, IContainer container) { config.DependencyResolver = new AutofacWebApiDependencyResolver(container);//注冊api容器 DependencyResolver.SetResolver(new AutofacDependencyResolver(container));//注冊MVC容器 } PRivate static IContainer RegisterServices(ContainerBuilder builder) { builder.RegisterApiControllers(Assembly.GetExecutingAssembly());//注冊api容器的實現 builder.RegisterControllers(Assembly.GetExecutingAssembly());//注冊mvc容器的實現 builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())//查找程序集中以services結尾的類型 .Where(t => t.Name.EndsWith("Services")) .AsImplementedInterfaces(); builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())//查找程序集中以Repository結尾的類型 .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces(); return builder.Build();//返回容器 } }}這個是autofac的配置文件。
下面是webapiconfig文件
using System;using System.Collections.Generic;using System.Linq;using System.Web.Http;using WebApiIoc.App_Start;namespace WebApiIoc{ public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); //注冊webapi和mvc容器 autofaconfig.Initialize(config); } }}最后是global文件
using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Web;using System.Web.Http;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using Autofac;using Autofac.Integration.Mvc;using Autofac.Integration.WebApi;using WebApiIoc.App_Start;namespace WebApiIoc{ public class WebApiapplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }}在apicontroller和MVCcontroller里面都是通過構造函數注入的方式實現的下面貼出來代碼
這個是MVC
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using Iservices;using Microsoft.Ajax.Utilities;namespace WebApiIoc.Controllers{ public class HomeController : Controller { private IOneServices _oneServices; public HomeController(IOneServices oneServices) { _oneServices = oneServices; } public ActionResult Index() { var sum = _oneServices.sum(10, 20); var aa = DependencyResolver.Current.GetService<IOneServices>(); ; ViewBag.Title = sum; return View(); } }}
這個是webapi
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Http;using System.Web.Http;using System.Web.Http.Dependencies;using Autofac;using Autofac.Integration.WebApi;using Iservices;namespace WebApiIoc.Controllers{ public class ValuesController : ApiController { private IOneServices _oneServices; public ValuesController(IOneServices oneServices) { _oneServices = oneServices; } // GET api/values public IEnumerable<string> Get() { var sum = _oneServices.sum(1, 2);return new string[] { "value1", "value2" }; } // GET api/values/5 public string Get(int id) { return "value"; } // POST api/values public void Post([FromBody]string value) { } // PUT api/values/5 public void Put(int id, [FromBody]string value) { } // DELETE api/values/5 public void Delete(int id) { } }}最后說明下如果你沒有通過構造函數注入你又想獲取實例的話怎么做呢。下面分別說明
MVC
var OneServices = DependencyResolver.Current.GetService<IOneServices>();
Webapi
IDependencyScope dependencyScope = this.Request.GetDependencyScope(); ILifetimeScope requestLifetimeScope = dependencyScope.GetRequestLifetimeScope(); var customerService = requestLifetimeScope.Resolve<IOneServices>();
其他的比如屬性注入和方法注入就不在這寫了。這里只是寫的常用的簡單的注冊方式,后面我會把這部分注冊的方式給補上.
基本到這里整個注冊流程就完事了。以上寫的不足之處請指出我會修正。希望和大家共同成長.
新聞熱點
疑難解答