ASP.NET MVC中简单使用Autofac

时间:2020-12-22 11:08:47

  项目中引入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
{
List<Libing.Portal.Web.Models.Province> GetProvinceList();
}
}

  ProvinceRepository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Libing.Portal.Web.Models
{
public class ProvinceRepository : IProvinceRepository
{
public List<Libing.Portal.Web.Models.Province> GetProvinceList()
{
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
{
List<Libing.Portal.Web.Models.City> GetCityList();
}
}

  CityRepository.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Libing.Portal.Web.Models
{
public class CityRepository : ICityRepository
{
public List<Libing.Portal.Web.Models.City> GetCityList()
{
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<Libing.Portal.Web.Models.ProvinceRepository>().As<Libing.Portal.Web.Models.IProvinceRepository>();
builder.RegisterType<Libing.Portal.Web.Models.CityRepository>().As<Libing.Portal.Web.Models.ICityRepository>();
}
}
}

  在Global.cs中的SetupResolveRules可以使用下面的方式来注册:

private static void SetupResolveRules(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
}

  利用ContainerBuilder的RegisterAssemblyTypes()方法来注册组件中的所有类,通过Where()筛选出全部以“Repository”结尾的类,并自动找出这些类所实现的接口,然后设定与其对应。