TinyFrame升级之四:IOC容器
在这个框架中,我们使用Autofac作为IOC容器,来实现控制反转,依赖注入的目的。
在程序加载的时候,我需要将系统中所有用到的接口与之对应的实现进行装载。由于用户交互部分是在TinyFrame.Web中,并且请求入口是在Application_Start方法中,所以我在这里进行了注入:
1: private void RegisterDependency()
2: {
3: var builder = new ContainerBuilder();
4:
5: builder.RegisterControllers(Assembly.GetExecutingAssembly());
6:
7: builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();
8: builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest();
9:
10: builder.RegisterType<BookContext>().As<IDbContext>().SingleInstance().PreserveExistingDefaults();
11: builder.RegisterType<ManagerRepository>().As<IManager>().InstancePerHttpRequest();
12: builder.RegisterType<BookLendRepository>().As<IBookLend>().InstancePerHttpRequest();
13: builder.RegisterType<BookPlaceRepository>().As<IBookPlace>().InstancePerHttpRequest();
14: builder.RegisterType<BookRepository>().As<IBook>().InstancePerHttpRequest();
15: builder.RegisterType<BookTypeRepository>().As<IBookType>().InstancePerHttpRequest();
16: builder.RegisterType<StudentRepository>().As<IStudent>().InstancePerHttpRequest();
17:
18: builder.RegisterType<ManagerService>().As<IManagerService>().InstancePerHttpRequest();
19: builder.RegisterType<BookService>().As<IBookService>().InstancePerHttpRequest();
20:
21: //builder.RegisterModule(new LogInjectionModule());
22: //注册HttpContextBase,在PerRequestCacheManager中使用了。
23: //builder.RegisterModule(new AutofacWebTypesModule());
24:
25: //HTTP context and other related stuff
26: builder.Register(c =>
27: //register FakeHttpContext when HttpContext is not available
28: new HttpContextWrapper(HttpContext.Current) as HttpContextBase)
29: .As<HttpContextBase>()
30: .InstancePerHttpRequest();
31: builder.Register(c => c.Resolve<HttpContextBase>().Request)
32: .As<HttpRequestBase>()
33: .InstancePerHttpRequest();
34: builder.Register(c => c.Resolve<HttpContextBase>().Response)
35: .As<HttpResponseBase>()
36: .InstancePerHttpRequest();
37: builder.Register(c => c.Resolve<HttpContextBase>().Server)
38: .As<HttpServerUtilityBase>()
39: .InstancePerHttpRequest();
40: builder.Register(c => c.Resolve<HttpContextBase>().Session)
41: .As<HttpSessionStateBase>()
42: .InstancePerHttpRequest();
43:
44:
45: builder.RegisterType<MemoryCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_static").SingleInstance();
46: //由于默认会使用PerRequestCacheManager,并且用户每请求一次数据,这个缓存都要重新创建一下。
47: //builder.RegisterType<PerRequestCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_per_request").InstancePerHttpRequest();
48:
49: builder.RegisterType<LoggerService>().As<ILoggerService>().InstancePerHttpRequest();
50:
51: var container = builder.Build();
52: DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
53:
54: }
这样我们就能通过构造函数中定义的接口名称,来直接使用其对象了。非常方便。
这里我来解释一下:
第3行:取得容器对象。
第5行:将系统中所有的controller进行注册。
第7行:将系统中的泛型对象和对应的泛型接口进行注册。
第8行:将系统中的对象和对应的接口进行注册。
第10行:类型被多次注册,后面的注册会覆盖前面的,可以通过PreserveExistingDefaults设定默认注册的值。
第45行:如果接口有多个实现,可以通过Named方法为其设置别名。
TinyFrame升级之四:IOC容器的更多相关文章
- 【spring源码分析】IOC容器初始化(三)
前言:在[spring源码分析]IOC容器初始化(二)中已经得到了XML配置文件的Document实例,下面分析bean的注册过程. XmlBeanDefinitionReader#registerB ...
- 【spring源码分析】IOC容器初始化(十二)
前言:在doCreateBean方法中还遗留一个问题没有分析:循环依赖.循环依赖在Spring中是非常重要的一个知识点,因此单独进行分析. 什么是循环依赖 循环依赖就是循环引用,两个或两个以上的bea ...
- Spring IOC 容器源码分析 - 获取单例 bean
1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...
- IOC容器:Unity
一.什么是IOC 学习IOC之前先来了解一个依赖导致原则(DIP),依赖导致原则是IOC的核心原理. 依赖导致:即上层模块不应该依赖于低层模块,二者应该通过抽象来依赖.依赖于抽象,而不是依赖于细节. ...
- 【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean
[spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>sp ...
- 手写IOC容器
IOC(控制翻转)是程序设计的一种思想,其本质就是上端对象不能直接依赖于下端对象,要是依赖的话就要通过抽象来依赖.这是什么意思呢?意思就是上端对象如BLL层中,需要调用下端对象的DAL层时不能直接调用 ...
- 对Spring IOC容器的思考
最近在看Spring5的视频教学,学到了IOC容器这块,对IOC有些浅薄的理解,分享一二:有错误之处,还请大佬指出 IOC(Inversion of Control 控制反转),是面向对象编程中的一种 ...
- 深入 Laravel 内核之IOC容器
升级工厂前的准备工作 无规矩不成方圆,随着越来越多的行为出现,我们需要需要定下一些规范. 为了约束每一个行为的规范,需要定义一个行为接口: interface BehaviorInterface { ...
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
随机推荐
- XMLA ODBO 以及OLAP服务提供者自定义的协议,我们如何选择
参考 SAP给他的客户的帮助<ODBO, BAPI and XMLA - Sap> SAP BW 提供的查询接口: 接口 查询语言 调用接口 OS平台 客户端开发 ODBO MDX C ...
- 关于NodeJS的思考
对于NodeJS来说传统程序员比较陌生,初看以为是什么前端框架,其实并不是前端框架.传统的Javascript只能跑在浏览器中,但是一位叫Ryan Dahl的开发者灵感一来,为什么Javascript ...
- PMBOK学习笔记二-项目管理过程
项目管理过程可归纳为五类,即五大项目管理过程组 启动过程组.定义一个新项目或现有项目的一个新阶段,授权开始该项目或阶段的一组过程..规划过程组.明确项目范围,优化目标,为实现目标制定行动方案的一组过程 ...
- Linux 僵尸进程查杀
僵尸进程概念 僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸. 书面形式一点:一个进程结束了,但是他的父进程没有等待(调用wait ...
- [MySQL Reference Manual] 6 安全性
6. 安全性 在Mysql安装配置时要考虑安全性的影响,以下几点: Ÿ 常规因素影响安全性 Ÿ 程序自身安全性 Ÿ 数据库内部的安全性,即,访问控制 Ÿ 网络安全性和系统安全性 Ÿ ...
- 【JavaScript】EasyUI框架的Dialog控件根据浏览器分辨率自动调节宽高
序: 如果单独一个或几个Dialog控件修改成根据浏览器可视界面自动调整高.宽很容易仅仅是一个量变的过程,但如果大量页面都引入了Dialog控件,修改起来是一个很消耗体力的工作.所以接到任务后第一想法 ...
- JS代码判断字符串中有多少汉字
$("form").submit(function () { var content = editor.getContentTxt(); var sum = 0; re = /[\ ...
- 使用axis调用WebService服务端
由于项目中要调用其他公司的接口,研究了下axis调用webService这种方式,现将代码贴出,以备以后查阅: package com.xbq; import javax.xml.namespace. ...
- Servlet/JSP-02 Servlet相关类
ServletConfig / ServletContext / ServletRequest / ServletResponse 一. ServletConfig:封装了Servlet得配置信息,并 ...
- 多元线性回归 ——模型、估计、检验与预测
一.模型假设 传统多元线性回归模型 最重要的假设的原理为: 1. 自变量和因变量之间存在多元线性关系,因变量y能够被x1,x2-.x{k}完全地线性解释:2.不能被解释的部分则为纯粹的无法观测到的误差 ...