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. 【转】django的ORM操作数据库样例

    这个算是我看到的大全了,希望可以解决明天我希望解决的两个问题... class Blog(models.Model): name = models.CharField(max_length=100) ...

  2. 【HDU3065】 病毒侵袭持续中(AC自动机)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  3. httpclient 超时设置

    最近项目客户反应超时经常出现:现已经总结超时设置: 使用是apache的HttpClient: DefaultHttpClient:请求超时httpclient.getParams().setPara ...

  4. 【HDOJ】1814 Peaceful Commission

    2-SAT基础题目. /* 1814 */ #include <iostream> #include <vector> #include <algorithm> # ...

  5. VM Depot 镜像新增系列III – 社交媒体,内容管理 与 项目协同系统

     发布于 2014-06-30 作者 刘 天栋 对于架设可协同作业的网站平台, Windows  Azure有着得天独厚的优势.这不仅在于其强大的扩展性和安全性,更重要的是 Azure 平台对各类 ...

  6. JSTL语法及参数

    转:http://blog.csdn.net/hakunamatata2008/article/details/3942812 JSTL语法及参数 JSTL包含以下的标签:     常用的标签:如&l ...

  7. SD卡中FAT32文件格式快速入门(图文详细介绍)

    说明: MBR :Master Boot Record ( 主引导记录) DBR :DOS Boot Record ( 引导扇区) FAT :File Allocation Table ( 文件分配表 ...

  8. iOS设备隐藏StateBar

    //隐藏StateBar - (BOOL)prefersStatusBarHidden {     returnYES; }

  9. MVC 5 第一章 起航

    本章将讲述一些构建ASP.NET  MVC 5 web application的一些基础知识, 通过本章学习,你应该能够掌握到构建MVC 5应用程序的基本步骤,并且通过展示一个完整的MVC 5 hel ...

  10. mvn archetyoe:generate -DarchetypeCatalog=internal

    可以使用 $mvn archetype:generate -DarchetypeCatalog=internal archetypeCatalog表示插件使用的archetype元数据,默认值为rem ...