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

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

一、注册autofac配置

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

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

二、bootstraper开始注册服务

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

有三种:

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

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

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

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

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

三、自定义Autofac控制器工厂

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

 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(requestContext, controllerType);
} return ContainerManager.Resolve(controllerType) as IController;
}

demo:http://tonyblogs.top/

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

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

从入门到放弃,.net构建博客系统(二):依赖注入的更多相关文章

  1. go语言打造个人博客系统(二)

    go语言打造个人博客系统(二)   在上篇文章go语言打造个人博客系统(一)中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发. 博客系统后端接口开发 路由测试 ht ...

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

    上篇django初探-创建简单的博客系统(一)已经记录了Django实现博客的发布的整个过程,接下来继续说明博客标题和内容的显示. 显示博客详细 将博客内容保存到数据库还不是发布博客的终极目的,博客一 ...

  3. 从入门到放弃,.net构建博客系统(一):系统构建篇

    demo:http://tonyblogs.top/ Git源码:https://github.com/Halifa/TonyBlogs 项目采用的技术有:asp.net mvc4 + autofac ...

  4. 使用Flask和Bootstrap构建博客系统(1) - 准备篇

    技术栈 macOS10.12.5 Python2.7.13 Bootstrap4.0.0-beta.2 virtualenv virtualenvwrapper 安装Python2.7.13 下载Bo ...

  5. django初探-创建简单的博客系统

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

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

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

  7. 基于SpringBoot从零构建博客网站 - 设计可扩展上传模块和开发修改头像密码功能

    上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片.pdf.压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等.在守望博客系统中对于上 ...

  8. 用Hugo在gitee上构建博客(Windows环境下)

    目录 用Hugo在gitee上构建博客(Windows环境下) 1.为什么要用gitee? 2.安装git 3.安装Hugo 4.创建远程仓库 5.搭建博客 (以下所有命令都在git bash中输入) ...

  9. LAMP实战之构建博客网站

    1.首先检查LAMP环境 [root@cairui htdocs]# ps -ef | grep httpd php Mar03 ? :: /opt/apache2.2.34/bin/httpd -k ...

随机推荐

  1. Binder的工作原理浅析

    在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...

  2. CUDA零内存拷贝 疑问考证

    今天思考了一下CUDA零内存拷贝的问题,感觉在即将设计的程序中会派上用场,于是就查了一下相关信息. 以下是一些有帮助的链接: cuda中的零拷贝用法--针对二维指针 cuda中的零拷贝用法--针对一维 ...

  3. Ionic 应用图标,信息修改

    Ionic 应用图标,信息修改 Ionic 应用图标 修改 准备好替换的图标并生成各个尺寸的图标 1.使用命令行进入项目根目录,执行命令ionic resources 替换的图片放在resources ...

  4. 初试spring-session

    一.简介 spring-session提供了用户会话信息管理的API和实现. 它将取代容器中的HttpSession.在没有容器会话集群方案的情况下,使得支持会话集群微不足道. 它支持在一个浏览器实例 ...

  5. Photoshop制作雪碧图技巧

    雪碧图,就是将网页制作中使用的多个小图片合并成一个图片,使用css技术将这张合成的图片应用在网页不同的地方. 雪碧图可以减少网页加载时的http请求数,优化网页性能. 步骤: a.使用Photosho ...

  6. Web自动化之Headless Chrome编码实战

    API 概览 && 编码Tips 文档地址 github Chrome DevTools Protocol 协议本身的仓库 有问题可以在这里提issue github debugger ...

  7. database.properties数据源

    jdbc.driver_class=oracle.jdbc.driver.OracleDriverjdbc.connection.url=jdbc:oracle:thin:@localhost:152 ...

  8. mysql生成百万级数量测试数据

    今天因为项目需要,想测试一下读取百万级数量数据的速度如何,无奈数据库没有现成符合要求的数据,网上百度一番有很都不错的文章,但是需要涉及到一些存储过程和用php代码什么的,虽说可以实现,但是感觉另外再弄 ...

  9. JQuery中实现Ajax

    简单小案例: $("input").click(function() { $.get("test.txt",function(data){ $("h1 ...

  10. RabbitMQ知多少

    1.引言 RabbitMQ--Rabbit Message Queue的简写,但不能仅仅理解其为消息队列,消息代理更合适.RabbitMQ 是一个由 Erlang 语言开发的AMQP(高级消息队列协议 ...