• .Net FrameWork的IOC


    一、

    1、创建项目

     选择空模板以及MVC引用

     2、添加Api控制器,并配置可访问

    3、IOC配置

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

    访问:

     注意:依赖包:

     mvc的

     注册Controller
    注册当前程序集下的所有Controller
    
    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    注册单个Controller
    
    builder.RegisterType<HomeController>().InstancePerRequest();

     

  • 相关阅读:
    leetcode 279. Perfect Squares
    leetcode 546. Remove Boxes
    leetcode 312. Burst Balloons
    leetcode 160. Intersection of Two Linked Lists
    leetcode 55. Jump Game
    剑指offer 滑动窗口的最大值
    剑指offer 剪绳子
    剑指offer 字符流中第一个不重复的字符
    leetcode 673. Number of Longest Increasing Subsequence
    leetcode 75. Sort Colors (荷兰三色旗问题)
  • 原文地址:https://www.cnblogs.com/fger/p/12131951.html
Copyright © 2020-2023  润新知