• 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”结尾的类,并自动找出这些类所实现的接口,然后设定与其对应。

  • 相关阅读:
    JavaSE 基础 第17节 流程控制之break、continue、return的用法
    JavaSE 基础 第16节 流程控制之循环结构
    JavaSE 基础 第15节 流程控制之选择结构
    JavaSE 基础 第14节 关系运算符、逻辑运算符与三元运算符
    JavaSE 基础 第13节 算术赋值运算符与自增自减运算符
    MySQL4-SQLAlchemy框架实现
    MySQL3>mysql进阶
    MySQL2>常用命令汇集
    MySQL1>概述
    python-协程
  • 原文地址:https://www.cnblogs.com/libingql/p/3791938.html
Copyright © 2020-2023  润新知