- 浏览: 112499 次
- 来自: ...
文章分类
最新评论
IoC避不开的一个问题是如何处理应用程序的模块化, 因为IoC通常针对单个对象提供了良好的支持, 比如依赖管理,生命周期管理,部署时配置甚至运行时配置, 但往往一组内聚的互相协作的对象才构成应用程序基本的构建块. 这组内聚对象间的协作关系是实现细节, 包括单个对象的构造函数和属性也是, 如果把这些暴露出来, 固然可以提高灵活性, 但是以最后的部署阶段的复杂性以及难以维护性为代价的. 以配置文件为例, 可能需要在包含了几百个对象定义的配置文件中, 去改动七八个属性, 变换五六个实现, 来适应不同的运行环境
两个解决这个问题的方向, 一个是IoC框架提供模块化支持, 以及部署时支持, 一种是IoC框架应该避开这个问题, 这本不属于IoC的范围, 应该交由专门的模块化框架如OSGi去解决
在我相对熟悉的IoC框架中, Autofac试图提供"Module"这个概念来解决一部分问题. 对象间的协作可以隐藏在Module对象中, 一些必要的参数可以通过Module的属性设置进来, 而对使用者,对部署只需暴露Module对象即可. 这是以丧失灵活性为代价的, 替换某个内部对象的实现变成了Hack, 需要通过团队成员间的交流, 源代码集体所有来完成. 如果在Module对象内部枚举扩展点的所有实现, 通过部署时的参数来挑选某个实现, 则会引入不必要的依赖, 更是得不偿失
个人倾向于第二种. 谁介绍一下.Net平台上的模块化框架?
所以相对聚焦一点, 了解一下IoC框架在处理单个对象的时候所需要解决的问题
1, 部署时如何方便的支持产品环境和测试环境, 即在不同环境下提供同一接口的不同实现
这个甚至不需要IoC框架解决, 应用开发人员在不同环境下提供不同配置文件即可. 那问题变成了
2, 如何简化配置, 使得框架能够自动识别依赖
这个被称为Auto wire, 一般根据构造函数参数或属性的类型来匹配依赖. 那么带来的一个问题是
3, 运行时如何动态切换同一个类型的不同实现, 比如用户选择了只读模式, 那么所有的Save操作都应被忽略不做任何事, 可以通过提供Save操作的Dummy版本来实现
Auto wire根据类型匹配有一定的局限性, 即同一个运行时环境有某个接口的多个实现怎么办. 这里实际上有一个概念, 即对象的标识. 而类型只是标识的一种. 另外一种适应性更广的标识是字符串. 有的框架称之为ID, 有的称之为name. 标识的重要特征就是在一个运行时环境里是唯一的. 类型标识因此也可以转化为字符串标识, 取其全名就可以了. (标识本身是个概念, 可以用一个类来表达, 然后有不同的子类实现, 如基于类型的标识, 基于字符串的标识等)
因此就有两种策略: 一种是允许运行时某个对象可以重新声明依赖的标识, 一种是运行时用同样标识的对象替换原先的实现. 后一种相对容易实现一点, 按注册顺序Last One Win就可以了
如果同一个类型的多个实例需要同时存在, 则部署时给予不同的ID即可. 然而另一个问题是
4, 多用户环境下, 如何保证每个用户都有自己的对象组合而不互相干扰
IoC框架一般被称为IoC容器. 容器这个概念是对运行时环境,上下文的封装, 提供了一组基础设施, 以及运行时所需的各种服务, 最重要的一点是, 它提供了在同一个进程里的隔离. 多用户环境下, 可以创建多个彼此独立的容器, 每个容器负责创建所需的对象, 提供所需的服务, 彼此之间互不影响. 于是带来新的问题,
5, 对象的生命周期如何管理
很显然, 有的对象概念上属于全局, 在程序运行过程中不能创建多个实例, 也不能被销毁. 有的跟用户的一次操作, 一次请求相关联, 同一次请求中可以复用同一个对象实例, 但不同请求必须创建不同的对象实例. 有的则每次需要访问它的时候都得创建一个新的实例. 容器必须提供基础设施, 让应用开发者可以指定对象的生命周期, 并在周期结束时销毁所有该销毁的对象. C# 提供了 Dispose 机制, 可供利用
其它的一些问题, 比如:
- 如何支持composite, decorator, proxy模式
- 如何方便用户注册, 包括自动注册
- 如何注入容器创建的对象到用户手工创建的对象中
- 如何与现有各种框架集成
- 如何避免循环引用: Constructor/property dependencies
- Open generics injection
- List injection Unregistered resolution
- Auto-mocking
- Startable
- Strongly-typed Activation Events
- Adding to an Existing Container
发表评论
-
Architecture is layered
2004-12-11 11:57 348那天被问道软件架构师需要了解编程语言的细节吗? 呵呵,架构是 ... -
Thinking Everyday
2004-12-11 12:01 3981,编程语言的发展趋势 ... -
糟糕命名集锦
2004-12-11 16:50 5471,公交支线,如375和375 ... -
古代的软件开发 (一)
2005-02-19 16:45 6521,额外的中间层鞋子:人类发明鞋子的意义无论如何评价都不过分, ... -
访问控制 : 语言和平台
2005-03-15 19:27 584程序逻辑上的组织方式(如名称空间,包等)可以和部署时的分发 ... -
Thinking Everyday II
2005-03-17 15:11 5961, 是业务,不是技术,傻瓜 是集成,不是编程 是使用,不 ... -
内容与标准为王:下一代互联网与下一代搜索
2005-07-25 14:53 624第一代互联网混淆了真正的数据和它的表现形式,第一代搜索无法 ... -
个性与定制为王:下一代互联网和下一代门户
2005-07-28 11:28 552看一下现在我与互联网有关的生活:我有两三个常用的Web邮箱 ... -
泛型编程 vs. 面向对象
2005-08-10 14:30 767面向对象:封装(数据抽象)是基础,继承是手段,多态是目的 ... -
函数式编程 vs. 对象式编程
2005-08-10 14:44 618<<我爱我家>>有一集和平摔成了脑 ... -
用手机从ATM取钱
2005-11-21 22:49 671手机的以下两个特性,使它潜在的可能成为统一的支付和信用平 ... -
Web 3.0 : Unified Human-like Interaction
2006-01-14 16:31 669你还在到搜索引擎的主页上去搜索吗?你还登录新闻网站查询最新比赛 ... -
软件生物学
2006-01-14 16:59 619长久以来,软件的建筑学隐喻已经深入人心,可始终无法达到建筑 ... -
广义对象论
2006-01-25 15:31 653前几天本想接着以前的思维中对“3.2 Programming ... -
Thinking Everyday III
2006-03-26 14:17 7541, RAII让我告别了delete,IoC让我告别了ne ... -
简单至及的AOP和IOC
2006-03-26 14:21 616I. AOP的例子 1, Google To ... -
TDD: Tricky Driven Development
2007-05-10 07:07 560命名 测试用例的名字应该描述需求, 不要描述实现. ... -
Thinking Everyday IV
2007-05-15 04:36 4931, 实际上 C# 2.0 已经部 ... -
迭代本质论
2008-02-14 13:58 591新年伊始, 可能你又要制定一些计划了, 实际上, 你的生活在开 ... -
建筑的永恒之道
2004-08-10 18:31 6172,质 这种特质是任 ...
相关推荐
spring IOC控制反转 spring IOC控制反转 spring IOC控制反转
OSINT-IOC汇总器从开源列表中收集网络IOC(域和IP),并将它们存储在MondoDB中。 提供了一个python网络前端,用于搜索数据。笔记该应用程序当前处于非工作状态。 python前端是旧版代码,我想用Flask重写它。资料来源...
Spring整体框架中的核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容在本源码中都有实现。 适合人群:具备一定编程基础,工作1-3年的研发人员 能学到什么:IOC、AOP、代理、切面等都是如何...
1.IoC的定义 IoC称为控制反转又叫DI(依赖注入)。 2.Spring Spring的定义:是一个IoC容器 分为: spring core spring beans: 组件工厂BeanFactory spring context: 环境,装配 spring expression 3....
主要介绍了Spring IOC原理补充说明(循环依赖、Bean作用域等),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
1. Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息; 1....<bean> 2....@Service、@Component、@Bean、xxx ...1. Spring容器会合适的时机创建这些Bean ... 1.... 2.... - xxx.......事件派发:
Spring Bean 的作用域之间有什么区别:Bean的作用域: 可以通过scope 属性来指定bean的作用域 ①singleton: 默认值。当IOC容器
文章目录一、概念和历史二、hellospring三、IOC创建对象的方式四、Spring配置五、set注入–属性注入六、c命名和p命名空间注入七 、bean的作用域 一、概念和历史 Spring的形成,最初来自Rod Jahnson所著的一本很有...
主要介绍了spring ioc的简单实例及bean的作用域属性解析,具有一定借鉴价值,需要的朋友可以参考下
如果bean的作用域的属性被声明为 singleton, 那么Spring Ioc容器只会创建一个共享的bean实例。对于所有的bean请求,只要id与该bean定义的相匹配,那么Spring在每次需要时都返回同一个bean实例。 Singleton是单例...
打字稿-tiny-ioc 用于 TypeScript/JavaScript 的微小控制反转容器。 这是一书第 8 章中技术的 github 存储库 介绍 控制反转是一种强大的编程技术,其中对象耦合在运行时绑定。 这在具有接口概念的语言中很容易...
1.spring中bean实例化的俩种方式 2.spring中bean的各种元素如何使用 3.spring中的bean管理 4.spring中不同类型bean的作用域 ...通过我的项目,可以跟着学习SPringIoC容器和Bean管理,帮助你快速上手SSM框架
Spring IoC容器基础作业 作业描述 阅读以下问题描述,按要求实现。 问题1 分支:p1-从这里开始 主观题:@Component已经可以支持声明一个bean了,为什么还要再弄个@Bean出来? 问题2 分支:p2-从这里开始 ...
单例模式,在整个spring IOC容器中,单例模式作用域的Bean都将只生成一个实例。一般Spring容器默认Bean的作用域为singleton 2>prototype: 与singleton相反, 每次通过容器的getBean()方法获取该作用域下的Bean时都...
创建命令的宏生成的值由多个域组合而成,所以即使是相同的基数,也会判断为不同的命令。设备驱动程序想要从命令中获取该基数,就使用下面的宏: _IOC_NR (cmd) 通常,在 switch 中的 case 中使用。
Bean的作用域Bean的作用域SingletonPrototypeRequestSessionGlobal Session 相关文章 跟着官网学spring—快速入门指南 跟着官网学Spring—构建RESTful Web服务 Spring从入门到入土——概述以及IOC理论推导 Spring从...
spring的IOC和DI? 答:控制反转和依赖注入是spring的两大基础作用。主要是将所有组件在spring提供的外部容器中加载。提高安全性,减低耦合性,使各个框架或者类之间的依赖性降低。 什么是声明式的事务管理?为什么要...
摘录了spring的核心逻辑,代码极度简化,保留spring的核心功能,如IoC和AOP,资源加载器,事件监听器,类型转换,容器扩展点,bean生命周期和作用域,应用某些等核心功能。 如果本项目能帮助到你,请给个STAR,谢谢...
scope 作用域;Spring 的继承;Spring 的依赖;Spring 的 p 命名空间;Spring 的工厂方法;IoC 自动装载(Autowire);AOP以及如何使用; 适用人群:比较适合与我一样的在校普通大学生进行学习整理,以及适合初学...