IoC 问题域

IoC 问题域 - 切尔斯基 - 博客频道 - CSDN.NET http://blog.csdn.net/chelsea/article/details/5727616

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,182评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 当时明月在 曾照彩云归
    御狮大夫阅读 121评论 0 0
  • 目录 第七章 八 从酒吧里出来,陈琪瑞大骂了我一顿。我本来就憋了一肚子委屈,他还骂得那么凶。骂我:“你个傻逼,你让...
    背光者_莫邪阅读 578评论 6 14