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