ASP.NET MVC中简单使用Autofac

  项目中引入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();
    }
}
View Code

  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();
            }
        }
    }
}
View Code

  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());
        }
    }
}
View Code

  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();
    }
}
View Code

  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();
            }
        }
    }
}
View Code

  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());
        }
    }
}
View Code

  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>();
        }
    }
}
View Code

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

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

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

posted @ 2014-06-16 23:36 libingql 阅读(...) 评论(...) 编辑 收藏