ASP.NET MVC中简单使用Autofac

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

  示例代码:

  IProvinceRepository.cs

ASP.NET MVC中简单使用Autofac
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

ASP.NET MVC中简单使用Autofac
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

ASP.NET MVC中简单使用Autofac
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

ASP.NET MVC中简单使用Autofac
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

ASP.NET MVC中简单使用Autofac
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

ASP.NET MVC中简单使用Autofac
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

ASP.NET MVC中简单使用Autofac
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”结尾的类,并自动找出这些类所实现的接口,然后设定与其对应。

你可能感兴趣的:(asp.net)