项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control。控制反转可以有效的降低类之间的相互依赖关系,增加架构的弹性,降低软件复杂度。
示例代码:
IProvinceRepository.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Libing.Portal.Web.Models{ public interface IProvinceRepository { ListGetProvinceList(); }}
ProvinceRepository.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Libing.Portal.Web.Models{ public class ProvinceRepository : IProvinceRepository { public ListGetProvinceList() { using (var ctx = new PortalContext()) { return ctx.Provinces.ToList(); } } }}
ProvinceController.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace Libing.Portal.Web.Controllers{ public class ProvinceController : Controller { private Libing.Portal.Web.Models.IProvinceRepository _provinceRepository; public ProvinceController(Libing.Portal.Web.Models.IProvinceRepository provinceRepository) { _provinceRepository = provinceRepository; } public ActionResult Index() { return View(_provinceRepository.GetProvinceList()); } }}
ICityRepository.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Libing.Portal.Web.Models{ public interface ICityRepository { ListGetCityList(); }}
CityRepository.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Libing.Portal.Web.Models{ public class CityRepository : ICityRepository { public ListGetCityList() { using (var ctx = new PortalContext()) { return ctx.Cities.ToList(); } } }}
CityController.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;namespace Libing.Portal.Web.Controllers{ public class CityController : Controller { private Libing.Portal.Web.Models.IProvinceRepository _provinceRepository; private Libing.Portal.Web.Models.ICityRepository _cityRepository; public CityController(Libing.Portal.Web.Models.IProvinceRepository provinceRepository, Libing.Portal.Web.Models.ICityRepository cityRepository) { _provinceRepository = provinceRepository; _cityRepository = cityRepository; } public ActionResult Index() { return View(_cityRepository.GetCityList()); } }}
Global.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Http;using System.Web.Mvc;using System.Web.Routing;using System.Reflection;using Autofac;using Autofac.Integration.Mvc;namespace Libing.Portal.Web{ // Note: For instructions on enabling IIS6 or IIS7 classic mode, // visit http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); #region Autofac注入依赖 var builder = new ContainerBuilder(); SetupResolveRules(builder); builder.RegisterControllers(Assembly.GetExecutingAssembly()); var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); #endregion WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); } private static void SetupResolveRules(ContainerBuilder builder) { builder.RegisterType().As (); builder.RegisterType ().As (); } }}
在Global.cs中的SetupResolveRules可以使用下面的方式来注册:
private static void SetupResolveRules(ContainerBuilder builder){ builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .Where(t => t.Name.EndsWith("Repository")) .AsImplementedInterfaces();}
利用ContainerBuilder的RegisterAssemblyTypes()方法来注册组件中的所有类,通过Where()筛选出全部以“Repository”结尾的类,并自动找出这些类所实现的接口,然后设定与其对应。