ASP.NET MVC中简单使用Autofac

  项目中引入Autofac的目的是为了实现控制反转,即IoC,Inversion of Control。控制反转能够有效的下降类之间的相互依赖关系,增长架构的弹性,下降软件复杂度。架构

  示例代码:ide

  IProvinceRepository.csui

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.csspa

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.cs3d

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.cscode

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.csblog

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.csci

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可使用下面的方式来注册:it

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

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

相关文章
相关标签/搜索