Autofac配置

 

using Autofac;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Web;
using System.Web.Http;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;

namespace WebAutoFac
{
    /// <summary>
    /// Autofac配置
    /// </summary>
    public class AutoFacBootStrapper
    {
        /// <summary>
        /// Autofac配置
        /// </summary>
        public static void CoreAutoFacInit()
        {
            #region MVC---install-package autofac.mvc5 注意版本

            //var builder = new ContainerBuilder();

            //SetupResolveRules(builder);

            ////注册所有的Controllers
            //builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
            //var container = builder.Build();
            //System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            #endregion

            #region Webapi和MVC ---install-package autofac.mvc5 install-package autofac.webapi2 注意版本

            var builder = new ContainerBuilder();
            SetupResolveRules(builder);

            //注册所有的Controllers
            builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
            //注册所有的ApiControllers
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();

            var container = builder.Build();
            //注册所有的Controllers
            builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
            //注册api容器需要使用HttpConfiguration对象
            HttpConfiguration config = GlobalConfiguration.Configuration;
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
            System.Web.Mvc.DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            
            #endregion
            

            #region 自动注入 --- 注释

            ////创建autofac管理注册类的容器实例
            //var builder = new ContainerBuilder();
            //HttpConfiguration config = GlobalConfiguration.Configuration;
            //Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
            ////注册所有实现了 IDependency 接口的类型
            //Type baseType = typeof(IDependency);
            //builder.RegisterAssemblyTypes(assemblies)
            //       .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
            //       .AsSelf().AsImplementedInterfaces()
            //       .PropertiesAutowired().InstancePerLifetimeScope();
            ////注册MVC类型
            //// builder.RegisterControllers(assemblies).PropertiesAutowired();
            ////注册Api类型
            //builder.RegisterApiControllers(assemblies).PropertiesAutowired();
            ////builder.RegisterFilterProvider();
            //builder.RegisterWebApiFilterProvider(config);
            //var container = builder.Build();
            ////注册api容器需要使用HttpConfiguration对象
            //config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
            ////注册解析
            //DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            #endregion

            //有了 IDependency 这个基接口,我们只需要 Global 中很简单的几行代码,就可以完成整个系统的依赖注入匹配
            //ContainerBuilder builder = new ContainerBuilder();
            //builder.RegisterGeneric(typeof(Repository<,>)).As(typeof(IRepository<,>));
            //Type baseType = typeof(IDependency);

            //// 获取所有相关类库的程序集
            //Assembly[] assemblies = ...

            //builder.RegisterAssemblyTypes(assemblies)
            //    .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
            //    .AsImplementedInterfaces().InstancePerLifetimeScope();//InstancePerLifetimeScope 保证对象生命周期基于请求
            //IContainer container = builder.Build();
            //DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }

        private static void SetupResolveRules(ContainerBuilder builder)
        {
            //WebAPI只用引用services和repository的接口,不用引用实现的dll。
            //如需加载实现的程序集,将dll拷贝到bin目录下即可,不用引用dll
            var iServices = Assembly.Load("IBLL");
            var services = Assembly.Load("BLL");
            //var iRepository = Assembly.Load("WebAPI.IRepository");
            //var repository = Assembly.Load("WebAPI.Repository");

            //根据名称约定(服务层的接口和实现均以Services结尾),实现服务接口和服务实现的依赖
            builder.RegisterAssemblyTypes(iServices, services)
              .Where(t => t.Name.EndsWith("BLL"))
              .AsImplementedInterfaces();

            ////根据名称约定(数据访问层的接口和实现均以Repository结尾),实现数据访问接口和数据访问实现的依赖
            //builder.RegisterAssemblyTypes(iRepository, repository)
            //  .Where(t => t.Name.EndsWith("Repository"))
            //  .AsImplementedInterfaces();

            //var cont = Assembly.Load("WebAutoFac");
            ////根据名称约定(服务层的接口和实现均以Services结尾),实现服务接口和服务实现的依赖
            //builder.RegisterAssemblyTypes(cont)
            //  .Where(t => t.Name.EndsWith("Controller"))
            //  .AsImplementedInterfaces();

            ////使用新的覆盖旧的注册DLL-使用UserNew代替UserOld
            //builder.RegisterType<BLL.UserBLL>().As<IBLL.IUserBLL>();

        }
    }
}
View Code

相关文章: