从入门到放弃,.net构建博客系统(二):依赖注入
文章目录:《从入门到放弃,.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;
}
Git源码:https://github.com/Halifa/TonyBlogs
如本文对您有帮助请移步右下角,推荐本文,谢谢大家的点赞,因为您的支持是我最大动力
从入门到放弃,.net构建博客系统(二):依赖注入的更多相关文章
- go语言打造个人博客系统(二)
go语言打造个人博客系统(二) 在上篇文章go语言打造个人博客系统(一)中,我们了解了go语言的优点和go语言的数据库操作,本次我们会完成博客系统的后端开发. 博客系统后端接口开发 路由测试 ht ...
- django初探-创建简单的博客系统(二)
上篇django初探-创建简单的博客系统(一)已经记录了Django实现博客的发布的整个过程,接下来继续说明博客标题和内容的显示. 显示博客详细 将博客内容保存到数据库还不是发布博客的终极目的,博客一 ...
- 从入门到放弃,.net构建博客系统(一):系统构建篇
demo:http://tonyblogs.top/ Git源码:https://github.com/Halifa/TonyBlogs 项目采用的技术有:asp.net mvc4 + autofac ...
- 使用Flask和Bootstrap构建博客系统(1) - 准备篇
技术栈 macOS10.12.5 Python2.7.13 Bootstrap4.0.0-beta.2 virtualenv virtualenvwrapper 安装Python2.7.13 下载Bo ...
- django初探-创建简单的博客系统
django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...
- django初探-创建简单的博客系统(一)
django第一步 1. django安装 pip install django print(django.get_version()) 查看django版本 2. 创建项目 打开cmd,进入指定目录 ...
- 基于SpringBoot从零构建博客网站 - 设计可扩展上传模块和开发修改头像密码功能
上传模块在web开发中是很常见的功能也是很重要的功能,在web应用中需要上传的可以是图片.pdf.压缩包等其它类型的文件,同时对于图片可能需要回显,对于其它文件要能够支持下载等.在守望博客系统中对于上 ...
- 用Hugo在gitee上构建博客(Windows环境下)
目录 用Hugo在gitee上构建博客(Windows环境下) 1.为什么要用gitee? 2.安装git 3.安装Hugo 4.创建远程仓库 5.搭建博客 (以下所有命令都在git bash中输入) ...
- LAMP实战之构建博客网站
1.首先检查LAMP环境 [root@cairui htdocs]# ps -ef | grep httpd php Mar03 ? :: /opt/apache2.2.34/bin/httpd -k ...
随机推荐
- 【Android Developers Training】 77. 使用Wi-Fi P2P进行服务搜索
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 41. 向另一台设备发送文件
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- iOS 本地视频和网络视频流播放
需求:最近公司需要做一个楼宇对讲的功能:门口机(连接WIFI)拨号对室内机(对应的WIFI)的设备进行呼叫,室内机收到呼叫之后将对收到的数据进行UDP广播的转发,手机(连接对应的WIFI)收到视频流之 ...
- htm5拖放和画布
拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 首先,为了使元素可拖动,把 draggable 属性设置为 true ondr ...
- MAC开发环境安装
MAC开发环境安装 安装sancha cmd: 安装: https://www.sencha.com/products/extjs/cmd-download/ cmd运行 $ open .bash_p ...
- angular4.0 父子组建之间的相互通信
父组建---->子组建 传递信息 首先先通过angular脚手架生成两个基本组件,有一个好处是 会自动关联到跟模版,节约时间,而且还是偷懒 ng generate component compo ...
- HttpServletResponse addHeader() 与 setHeader() 区别
对于addHeader() 和 setHeader()这两个方法,可能我们在需要的时候,用起来感觉都一样,都能达到想要的效果.但是这两个方法本质上是不一样的. setHeader(name, val ...
- JavaService实现Windows服务
下载JavaService.exe文件 下载地址:http://pan.baidu.com/s/1boWk1uJ(支持Windows 7 64位) 创建server文件目录 在D盘新建一个文件夹如:D ...
- 基于JQ的单双日历,本人自己写的哈,还没封装,但是也能用
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>小 ...
- 1. MongoDB 安装和启动
1. MongoDB是一个Document Database.A record in MongoDB is a document,MongoDB documents are similar to JS ...