• 从入门到放弃,.net构建博客系统(二):依赖注入


    文章目录:《从入门到放弃,.net构建博客系统》

    上一篇中有讲到项目启动时会进行ioc的依赖注入,但具体是怎么注入的呢?我们先一步步往下走

    一、注册autofac配置

    首先bootstraper会进行初始化,接着将当前mvc控制器工厂改为AutofacControllerFactory。

     1 public class AutofacConfig
     2     {
     3         /// <summary>
     4         /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
     5         /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
     6         /// </summary>
     7         public static void Register()
     8         {
     9             Bootstrapper boot = new Bootstrapper();
    10             boot.Start();
    11 
    12             //将MVC的控制器对象实例 交由autofac来创建
    13             ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory());
    14         }
    15     }
    View Code

    二、bootstraper开始注册服务

    在注册服务前,我们先定义一个容器生成器ContainerBuilder,用以注册服务;接着我们会获取当前项目所有引用的程序集,对其中的类型进行判断,如果符合条件就会注册进去。那哪些类型会注册进去呢?

    有三种:

      1. IDependency,仓储层和服务层的接口都继承该接口,注册的服务会在容器每次resolve的时候,生成一个新对象

      2. ISignleton,日志和缓存接口继承该接口,每次解析都会返回统一对象,即单例对象

      3. Module,其中暴露了ContainerBuilder对象,由模块自定义注册方式,项目中webapp层有个MvcControllerModule,用于将所有实现IController给注册进去

     1 public void Start()
     2         { 
     3             Type baseType = typeof(IDependency);
     4 
     5             // 获取所有相关类库的程序集
     6             Assembly[] assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray();
     7             
     8             containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
     9                 .AsImplementedInterfaces().InstancePerDependency();//每次解析获得新实例
    10 
    11             Type singletonType = typeof(ISignleton);
    12             containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => singletonType.IsAssignableFrom(type) && !type.IsAbstract)
    13                 .AsImplementedInterfaces().SingleInstance();// 保证对象生命周期基于单例
    14 
    15             containerBuilder.RegisterAssemblyModules(assemblies);//所有继承module中的类都会被注册
    16 
    17             var container = containerBuilder.Build();
    18             ContainerManager.SetContainer(container);
    19         }
    View Code

    依赖注册好后,会生成IOC容器,接着将容器管理器的IOC容器设置为该容器,以后所有的服务的解析可以通过管理器来解析。

     三、自定义Autofac控制器工厂

    第一步中我们将控制器工厂改为AutofacControllerFactory,这个控制器工厂重写了GetControllerInstance,主要在解析控制器类型时,用ContainerManager去解析控制器类型,这样就能把控制器中的依赖给注入进去。

    1 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    2         {
    3             if (controllerType == null)
    4             {
    5                 return base.GetControllerInstance(requestContext, controllerType);
    6             }
    7 
    8             return ContainerManager.Resolve(controllerType) as IController;
    9         }
    View Code

    demo:http://tonyblogs.top/

    Git源码https://github.com/Halifa/TonyBlogs

    如本文对您有帮助请移步右下角,推荐本文,谢谢大家的点赞,因为您的支持是我最大动力

  • 相关阅读:
    错误 2 error C2059: 语法错误:“::”
    完全卸载session 所需要的函数
    header("Location:http://www.baidu.com");
    php str_pad() 用法
    php str_pad();
    设计模式系列-01-开篇
    博客园样式的设置系列-01-侧边栏和皮肤的设置
    vs20132015UML系列之-类图
    php获取当前时间和转换格式
    saltstack:multi-master configuration
  • 原文地址:https://www.cnblogs.com/shinly/p/7351799.html
Copyright © 2020-2023  润新知