zoukankan      html  css  js  c++  java
  • .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();

     

  • 相关阅读:
    【Mysql】Mysql在Linux操作系统下在线安装
    【Mysql】Mysql实战:分页查询、(批量)添加、修改、(批量)删除
    【Nginx】Ngnix在Linux操作系统下的安装及搭建
    【Linux】Shell-解压/压缩、软件安装(jdk、tomcat)
    【Linux】用户创建修改切换、文件权限管理
    【Linux】文件操作命令、管道命令、文件编辑命令(VI)
    kafka学习 回顾以及新知识
    Scale Up 和 Scale Out存储架构
    计算机五层网络模型--回顾
    kafka学习(一)
  • 原文地址:https://www.cnblogs.com/fger/p/12131951.html
Copyright © 2011-2022 走看看