My.Ioc 是作者开发的一款开源 IoC/DI 框架,下载地址在此处。它具有下面一些特点:

高效

在实现手段上,My.Ioc 通过使用泛型、缓存、动态生成代码、延迟注册、尽量使用抽象类而非接口等方式来提高框架的性能。如果您想进一步了解通过上面这些手段,我们能够获得怎样的性能,请看这篇文章

便于扩展

在设计时,可扩展性是作者始终关注的问题之一。My.Ioc 也确实提供了良好的可扩展性。您可以通过以下方式实现扩展:

1. 自定义 Lifetime 实现。

2. 注册自定义 ObjectBuilderRequested 事件 Handler 以实现延迟注册(参见这篇文章)。

3. 通过添加自定义 IConstructorInjectionConfigurationItem/IMemberInjectionConfigurationItem 以及修改现有 IInjectionConfigurationInterpreter 的方式增加或修改对象创建逻辑(参见这篇文章)。例如,要想给某个现有注册项增加 Decorator,可以通过增加一个 IConstructorInjectionConfigurationItem 的方式来实现。

配置简单

使用代码方式进行注册,而不必编写一大堆配置文件那么繁琐。当然,配置方式是可以扩展的,而且也很容易扩展。如果您喜欢,您也可以自行实现一个通过配置文件进行注册的机制。

功能全面

  • 支持构造函数、属性和方法注入(参见这篇文章这篇文章)。
  • 采用 Fluent Api 方式进行配置。
  • 自动注册/解析未注册的类型(必须是具体类型,而不能是接口、抽象类或值类型。参见这篇文章)。
  • 支持 Open Generic 类型注册。
  • 支持延迟注册(参见这篇文章)。
  • 良好的可扩展性(参见这篇文章)。
  • 默认提供 Container/Scope/Transient 三种 Lifetime,但允许自定义 Lifetime。
  • 支持元数据(参见这篇文章)。
  • 支持条件绑定(或称上下文绑定。例如,如果有多个类(使用者)都需要依赖于 IMyService 服务,那么使用者在注册不同 IMyService 实现时,可以指定只有满足某些条件的使用者才能使用该实现。参见这篇文章)。
  • 支持依赖对象映射(例如,某个类的构造函数需要依赖于一个 IEnumerable<IMyService> 对象,而 IEnumerable<IMyService> 未注册,但容器中注册了 IMyService 的一个或多个实现,此时可通过对象映射器 [ObjectMapper] 将这些实现组装成一个 IEnumerable<IMyService> 对象以满足构造需要)。
  • 支持注销对象(参见这篇文章)。
  • 提供 IObjectObserver/IObjectCollectionObserver 机制,可以在所依赖的对象注册/注销/激活/停用时收到事件通知,从而更好地响应变化(参见这篇文章)。
  • 支持 .net 2.0。

面向服务考虑

在面向服务环境中,服务经常处于变化之中。一个服务可能在这一时刻可用,但下一时刻已不可用。为此,框架提供了注销 (Unregister) 功能和观察者 (IObjectObserver/IObjectCollectionObserver) 机制来适应这种变化。使用者可以在运行过程中随时注销某个服务实现(前提是该实现由该使用者注册,而且该使用者在注册服务时保留了该服务的 IObjectRegistration 对象)或注册新的服务实现以替代已被注销/过期 (Obsolete) 的服务实现,而其他依赖于该服务的上层服务将会随着该服务的注销/注册而自动停用/激活,相关的观察者则会向自身的 Changed 事件订阅者发送服务激活 (Activated)/停用 (Deactivated) 的通知。

富于交互性

框架提供了 ObjectBuilderRegistered/ObjectBuilderUnregistering/ObjectBuilderRequested 事件、IObjectObserver/IObjectCollectionObserver 的通知事件、ILifetimeScope 的 LifetimeScopeEnded 事件(可用于在资源释放后执行自定义操作)、IObjectRegistration 的 Changed 事件等各类事件,使用者可以根据需要订阅它们,以实现与框架的交互。

安全性

安全性是作者在设计时的重要考量之一。框架具备线程安全性,可用于多线程环境中。此外,框架通过 ILifetimeScope 来管理资源的释放 (Dispose)。使用者在解析(获取)对象/服务时,必须指定相应的 ILifetimeScope,并在使用完成后正确释放 ILifetimeScope,从而确保资源安全性。最后,框架遵循最小可访问性原则(尽量使用 private、protected、internal,少用 public),以保证良好的封装和可见性控制,从而防止 Api 滥用或误用。

零侵

同安全性一样,侵入性也是作者在设计时的考量之一。因此,我们摒弃了其他一些 Ioc 框架(例如 NInject/Unity)所采用的通过 Attribute 标注实现某些功能的方式(例如标注某个要注入的构造函数/属性/方法等),转而要求使用者在注册时提供具体信息(例如在配置方法注入时,只需提供方法名称即可。但如果该方法含有多个重载,则需提供具体的 MethodInfo),以保证框架的零侵入性。

国人编写的开源 .net Ioc 框架——My.Ioc 简介的更多相关文章

  1. IOC框架之Ninject 简介

    还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 上篇博客介绍了依赖注入的三种方式:构造方法注入,属性注入,接口注入!详情请参考 ...

  2. 解读 IoC 框架 InversifyJS

    原文链接 InversityJS 是一个 IoC 框架.IoC(Inversion of Control) 包括依赖注入(Dependency Injection) 和依赖查询(Dependency ...

  3. 自己动手编写IOC框架(一)

    博客创建了2年多了,一直没敢写点东西,怕技术不够误导了别人.2年多后的今天我已经很有信心能够为需要帮助的人做点微薄的贡献了.这是我第一次写博客,先自我介绍一下.本人网名泪滴,一个非常伤心的名字,生活中 ...

  4. Leaf - 一个由 Go 语言编写的开发效率和执行效率并重的开源游戏服务器框架

    转自:https://toutiao.io/posts/0l7l7n/preview Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏 ...

  5. 自己动手编写IOC框架(四)

    终于到了激动人心的时刻了,首先感谢小伙伴们的阅读,如果能多点评论,多点探讨就更好了,没有交流让我觉得我写的东西只有标题有点价值,内容只是在浪费大家的时间.为了泪滴下周能写下一个框架orm,请小伙伴们能 ...

  6. Spring框架[一]——spring概念和ioc入门(ioc操作xml配置文件)

    Spring概念 spring是开源的轻量级框架(即不需要依赖其他东西,可用直接使用) spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码来实现: ioc:控制反转,比如:有一个 ...

  7. 轻量级IOC框架:Ninject (上)

    前言 前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject.通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninje ...

  8. .Net常见的IOC框架及AOP框架

    IOC框架 Unity:微软patterns&practicest团队开发的IOC依赖注入框架,支持AOP横切关注点. MEF(Managed Extensibility Framework) ...

  9. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

随机推荐

  1. AVOIR发票的三种作用

    1. 开错了发票,应收多写了,应该抵消掉一部分应收2. 客户临时有变化,比如只买一部分产品,取消了另一部分,那么也是开AVOIR抵消了一部分应收3. 退钱给客户的时候,也要开一张AVOIR发票 注意, ...

  2. HDFS文件系统基本文件命令、编程读写HDFS

    基本文件命令: 格式为:hadoop fs -cmd <args> cmd的命名通常与unix对应的命令名相同.例如,文件列表命令: hadoop fs -ls 1.添加目录和文件 HDF ...

  3. wpf 动画

    1动画实现 通过控件的属性 RenderTransform 设置 (1)设置控件的变化类型,如平移变化,旋转变化等,变化起点. (2)根据属性值链接相应的动画类型,如简单动画,关键帧,路径动画以及故事 ...

  4. 对于利用ica进行fmri激活区识别的理解

    首先,ica是一种探索性的方法,属于数据驱动的范畴. ica计算量很大,一般都是离线式计算. ica基于的猜想是,世界是加性的.在我们所研究的脑科学中,所采集到的BOLD信号,是由一些源信号所构成,更 ...

  5. wpa_supplicant无线网络配置

    目前可以使用wireless-tools 或wpa_supplicant工具来配置无线网络.请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口. wpa_supplicant是一个较好 ...

  6. Rails 看起来很不错哦。

    最新在工作中遇上了ruby,确切的说是rails. 其实我的工作是一个渗透测试工程师(其实就是拿着一堆黑客工具扫描的活).   而我不怎么了解ruby on rails.但是客户即将上线的商城系统是用 ...

  7. unity3d 制造自己的水体water effect(一)

    first,I wish you a happy new year, and study in spring festival’s eve means you are hardworking,haha ...

  8. PHP的哲学:Simple Is Hard

    原帖地址 PHP框架的繁荣是正确的发展方向吗?   作者 正文 poshboytl    发表时间:2009-01-19   最后修改:2009-04-06   做ROR有一年了, 感觉非常好.配合敏 ...

  9. JavaScript高级程序设计15.pdf

    组合继承的问题是会调用2次超类型构造函数 寄生组合式继承 即通过借用构造函数来继承属性,通过原型链的形式来继承方法,思路:不必为了指定子类型的原型而调用超类型的原型,我们所需要的无非是超类型原型的一个 ...

  10. automake---让Makefile变得更专业一点儿

    一般我们装软件时,都要运行 ./configure --prefix=/usr/local make make install 看着不断刷新的屏幕,总感觉真得好高深呀,其实我们的程序也可以这样子. 下 ...