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

  • 从入门到放弃,.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

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

转载于:https://www.cnblogs.com/shinly/p/7351799.html

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

  1. python入门指南bl-Python Flask开源博客系统Bl

    本博文在51CTO技术博客首发. 开源不易,Python良心之作,真心送给广大朋友,恳请给予支持,不胜感激! 大家可以从下面的地址中去体验Blog_mini的功能,我把副本部署在了腾讯云上供大家使用: ...

  2. golang入门项目——Gin框架简易博客系统1.0

    文章目录 开发前的准备 需求分析 项目截图 代码 开发前的准备 需要集成markdown编辑器 下载地址 需求分析 1.能够实现用户的注册与登录 2.能够编写并保存博客 3.能够对保存的博客进行展示 ...

  3. 手把手带你搭建个人博客系统(二)

    ⭐️前言⭐️ 因文章篇幅较长,所以整个流程分两篇文章来完成.

  4. 博客系统知多少:揭秘那些不为人知的学问(三)

    点击上方关注"汪宇杰博客" 上篇<博客系统知多少:揭秘那些不为人知的学问(二)>介绍了博客的基本功能设计要点,本篇介绍博客的协议或标准. 1."博客" ...

  5. Ubuntu服务器上搭建solo个人博客系统

    最近想要尝试一下搭建一个个人博客来记录自己的学习和生活,因此选择了基于java的solo博客系统来尝试搭建一下,主要的步骤有: 购买服务器 购买域名及备案 安装博客程序 通过github登录博客后台设 ...

  6. 免费打造个人博客系统

    自媒体越来越受重视,写作能力也变得更加重要,但万事开头难,第一步:构建一个人文章发布平台,都难道不少人,今天介绍一种免费搭建个人博客系统的方法,不仅能成为自己写作平台,还可以将文章轻松发布到其他公共平 ...

  7. django初探-创建简单的博客系统(一)

    django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...

  8. codewarrior 入门(来源于逍遥呤博客)

    codewarrior 入门(来源于逍遥呤博客) (2009-08-08 12:12:15) 转载 标签: 杂谈 分类: ARM系列 1.首先是要建立工程,new->ARM Executable ...

  9. 博客系统ZBLOG打赏插件构建:设置支付宝和微信接口[图]

    2019独角兽企业重金招聘Python工程师标准>>> 对于爱写博客的朋友们来说,ZBLOG系统是国内出名的优秀博客系统,非常适合中小型站长和博主们写作,对于我们来说,博客的质量一般 ...

最新文章

  1. 【性能优化】小伙伴问我性能指标监控怎么做,这次我安排上了!!
  2. springboot打包成jar包后找不到xml,找不到主类的解决方法
  3. python发明者叫什么-编程语言简史:有人不喜欢花括号,于是他发明了 Python
  4. juniper交换机 mac地址和端口绑定
  5. SD从零开始14 定价中的特殊功能(Special Functions)
  6. Ubuntu 18.04 + Anaconda 5.2 + Pycharm
  7. c语言case可以判断多个条件吗,case 多个条件
  8. mvvm 耗时加载进度条_ZK的实际应用:MVVM –加载和渲染数据
  9. SqlServer为什么自动在主键上建立聚集索引
  10. 马化腾最新演讲谈机遇:让所有企业在云端利用AI处理大数据
  11. 基于SURF特征的目标检测
  12. 一条SQL语句查询出成绩名次 排名 (转)
  13. Android实现保存图片和视频到系统相册
  14. postman小技巧-提取变量及设置变量
  15. MySQL 之 The definition of table 'p' prevents operation UPDATE on table 'post'.
  16. python自然语言的背景_Python自然语言工具包(NLTK)入门
  17. 机械电气自动化常用知识手册
  18. 驱动程序开发:多点电容触摸屏
  19. 蔡盈芳:企业数字档案馆整体架构及其层次模型研究
  20. Win10怎么关闭smartscreen筛选器检测功能?

热门文章

  1. 【最佳实践】Elasticsearch Snapshot 备份的使用方法
  2. 重磅发布 | 承载亿级流量的开发框架,闲鱼Flutter技术解析与实战大公开
  3. 深度前沿:对话管理模型研究最新进展
  4. ubuntu mysql 迁移_(最新)ubuntu20.04LTS版迁移mysql8.0数据库的方法
  5. 数据库面试题【十一、InnoDB引擎的4大特性】
  6. Nginx与Tomcat区别
  7. 零基础学Python(第七章 while循环)
  8. 零基础学Python(第六章 if条件语句)
  9. innobackupex中--slave-info参数的含义和适用场景
  10. 小米11pro和vivox60哪个好