using Autofac; using Autofac.Integration.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Web; using System.Web.Mvc; using System.Web.Routing; using System.Web.Http; using Autofac.Integration.WebApi; namespace IOCDemo { public class MvcApplication : System.Web.HttpApplication { #region 注入 //这里一定要注意,首先依赖关系接口一定要设置为静态的,并且是public。不然用到的时候无法调用。 public static IContainer container { get; set; } public void Dependency() { var builder = new ContainerBuilder(); /* 1、注册 * RegisterGeneric:注册非参数化泛型类型:RegisterGeneric(typeof(类)).As(typeof(接口)) * RegisterType:通过RegisterType<类>.As<接口>() 来注册不是泛型的类 */ builder.RegisterType<TestService>().As<ITestService>(); /* 2、获取接口类型 * 通过IDependency标记需要依赖注入的接口 * 注册所有实现了IDependency接口的类型 */ Type baseType = typeof(ITestService); /* 3、获取所有程序集 * 当CLR COM服务器初始化时,它会创建一个AppDomain。 AppDomain是一组程序集的逻辑容器 */ //var assemblies = AppDomain.CurrentDomain.GetAssemblies();//这种写法AppDomain重新启动后会丢失程序集 var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray(); /* 4、自动注册接口 * 筛选出对应条件的接口 * IsAssignableFrom:返回true的条件:是否直接或间接实现了IDependency * IsAbstract:是否为抽象类 * AsImplementedInterfaces:以接口的形式注册 * InstancePerLifetimeScope:同一个Lifetime生成的对象是同一个实例 */ builder.RegisterAssemblyTypes(assemblies) .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract).AsImplementedInterfaces().InstancePerLifetimeScope(); /*5、自动注册MVC与api控制器 */ builder.RegisterControllers(Assembly.GetExecutingAssembly()); builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); IContainer container = builder.Build(); /*6、ApiController WebApi注入 */ var webapiresolver = new AutofacWebApiDependencyResolver(container); GlobalConfiguration.Configuration.DependencyResolver = webapiresolver; /*7、mvc注入 */ DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); } #endregion protected void Application_Start() { Dependency(); GlobalConfiguration.Configure(WebApiConfig.Register); AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); } } }
注册Controller 注册当前程序集下的所有Controller builder.RegisterControllers(typeof(MvcApplication).Assembly); 注册单个Controller builder.RegisterType<HomeController>().InstancePerRequest();
原文:https://www.cnblogs.com/fger/p/12131951.html