摘要: IoC/DI 这个概念,最初是由Martin Fowler 提出来的。之后,很快在 Java 社区大行其道。在 .net 社区,IoC 的流行要比 Java 晚一些。尽管如此,现在开源社区中也已经出现了很多使用 .net 编写的 IoC 框架,比较有代表性的有:Castle Windsor/Spri... 阅读全文
posted @ 2014-09-12 12:20 Johnny.Liu 阅读(1080) 评论(0) 推荐(0) 编辑
摘要: 本文的目的在于通过一些示例,向大家说明 My.Ioc 支持哪些类型的依赖关系。也就是说,如何设计对象不会导致循环依赖。在 Ioc 世界中,循环依赖是一个顽敌。这不仅因为它会导致 Ioc 容器抛出异常,而且还因为它是不可预知的,尽管通过仔细的配置是可以尽量避免这个问题的。当我们在 Ioc 容器中注册对... 阅读全文
posted @ 2014-09-11 20:07 Johnny.Liu 阅读(516) 评论(0) 推荐(0) 编辑
摘要: 装饰器模式体现了一种“组合优于继承”的思想。当我们要动态为对象增加新功能时,装饰器模式往往是我们的好帮手。很多后期出现的 Ioc 容器都为装饰器模式提供了支持,比如说 Autofac。在 My.Ioc 中,默认不提供装饰器支持,但我们可以自己进行扩展,以提供此项功能。using System;usi... 阅读全文
posted @ 2014-09-11 16:44 Johnny.Liu 阅读(320) 评论(0) 推荐(0) 编辑
摘要: 在 My.Ioc 中,我们可以指定让容器在构建好对象实例之后,自动为我们调用对象的公共方法或是为对象的公共属性赋值。在解析对象实例时,容器将根据我们在注册对象时指定的方法调用或属性赋值的先后顺序,调用对象的实例方法或为其属性赋值。用法比较简单,请看下面的示例代码:using System;using... 阅读全文
posted @ 2014-09-11 11:08 Johnny.Liu 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 在 Ioc 世界中,有些框架(例如 Autofac/NInject/Unity)支持传递默认参数,有些框架(例如 SimpleInjector/LightInjector 等)则不支持。作为 My.Ioc 来说,我们支持默认参数。当我们在 My.Ioc 中注册对象时,有些对象类型 (System.T... 阅读全文
posted @ 2014-09-11 10:35 Johnny.Liu 阅读(556) 评论(0) 推荐(0) 编辑
摘要: 当您需要从 Ioc 容器中注销/删除一个注册项的时候,您会怎么做呢?有人曾经在 stackoverflow 上提问“如何从 Unity 中注销一个注册项”。对于这个问题,有人的回答是“有趣。你为什么要这样做?”,也有人试图提出一些变通的解决办法,例如通过自定义 LifetimeManager 来实现... 阅读全文
posted @ 2014-09-10 11:49 Johnny.Liu 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 在 My.Ioc 中,要想在服务注销/注册时获得通知,可以通过订阅 ObjectBuilderRegistered 和 ObjectBuilderUnregistering 这两个事件来实现。但是,使用这两个事件也有一些不足。首先,它们只能针对当前注册/注销的服务发出通知,而对于依赖当前服务的上层服... 阅读全文
posted @ 2014-09-10 11:11 Johnny.Liu 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 在很多 Ioc 容器中,当使用者向容器请求实现了某个契约类型 (Contract Type) 的服务时 (调用类似如下方法 container.Resolve(Type contractType)),如果该服务尚未注册,而且该契约类型符合某种约定,那么容器将会自动为将该契约类型创建一个注册项 (Re... 阅读全文
posted @ 2014-09-10 10:09 Johnny.Liu 阅读(520) 评论(1) 推荐(1) 编辑
摘要: 在使用 Ioc 框架时,一般我们建议集中在一个称为 Composition Root(其含义请参见下面的小注)的位置来注册 (Register) 和解析 (Resolve) 服务。这种做法的目的在于限制 Ioc 的使用场合,防止在应用程序中到处引用 Ioc 框架,从而尽量减少应用程序本身对于 Ioc... 阅读全文
posted @ 2014-09-09 23:20 Johnny.Liu 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 本文旨在通过创建一棵插件树来演示条件绑定和元数据的用法。说“插件树”也许不大妥当,因为在一般观念中,谈到插件树,我们很容易会想到 Winform/Wpf 中的菜单。举例来说,如果要在 Winform 中创建一个层级菜单,我们可以使用类似如下代码:// Create File menuvar newM... 阅读全文
posted @ 2014-09-09 11:15 Johnny.Liu 阅读(337) 评论(0) 推荐(0) 编辑