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容器等概念.通过本文我们将一起学 ...
随机推荐
- android 进程/线程管理(一)----消息机制的框架
一:android 进程和线程 进程是程序运行的一个实例.android通过4大主件,弱化了进程的概念,尤其是在app层面,基本不需要关系进程间的通信等问题. 但是程序的本质没有变,尤其是多任务系统, ...
- 数据库 DROP命令和DELETE命令的本质区别是什么
不同点: 1. 从删除内容上区分: truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结构.被依赖的约束(constrain),触发器(trigger),索引(i ...
- C#八皇后问题 枚举值
记得刚出道的时候, 有考虑怎么面试, 以及可能会遇到的面试题, 有一个人说了一下 八皇后问题, 据说要用 sql 语句写出来, 暂时我 写了一个C#版本的, 经测验,八皇后算法结果为 92种, 这个与 ...
- OOP应用:实体类
实体类 定义:实体类是一个业务实体的类,而业务实体就是整个软件系统业务所涉及的对象. 使用: 1.新增实体类项目,增加类库项目,以.Modes作为后缀. 2.抽取对象以及属性.(简单地说,对象就是每个 ...
- maven 安装alipay-sdk包到本地及远程仓库
安装到本地:mvn install:install-file -DgroupId=com.alipay -DartifactId=sdk-Java -Dversion=*** -Dpackaging= ...
- 烂泥:apache密码生成工具htpasswd的应用
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 1. htpasswd的作用与安装 2. htpasswd命令详解 3. htpasswd的实例 4. htpasswd的应用 一.htpasswd的作 ...
- 烂泥:CentOS命令学习之tar打包与解压
本文由秀依林枫提供友情赞助,首发于烂泥行天下. tar命令一般是做打包和解压使用,有关tar命令的使用.我们可以通过帮助文档进行查看,如下: tar –help man tar tar有几个比较重要的 ...
- TCMalloc:线程缓冲的Malloc
这段时间比较闲,研究下内存管理,从官方文档开始啃起<TCMalloc : Thread-Caching Malloc>. 1.动机 TCMalloc要比glibc 2.3的malloc(可 ...
- 谁在死锁Mutex——用Windbg查找Mutex死锁所有者线程
Who is blocking that Mutex? - Fun with WinDbg, CDB and KD 05 Aug 2006 By Ingo Rammer I'm currently t ...
- Struts2工作原理
Struts2工作原理 Struts2请求响应流程: 在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller.ActionProxy.Acti ...