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. iOS出现 Undefined symbols for architecture armv7 std::basic_string<char, std::char_traits<char>

    Undefined symbols for architecture i386: “_OBJC_CLASS_$_XXX”, referenced from: objc-class-ref in XXX ...

  2. Hibernate 使用HQL的 in 时要注意判断in的值(list)是否包含数据

    如果你使用 HQL的 in,例如: sessionFactory.getCurrentSession() .createQuery("select hlInfo.id, count(id) ...

  3. 【HDOJ】1466 计算直线的交点数

    找了个规律. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 21 ...

  4. [LeetCode#265] Paint House II

    Problem: There are a row of n houses, each house can be painted with one of the k colors. The cost o ...

  5. BZOJ1271: [BeiJingWc2008]秦腾与教学评估

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1271 题解: 这种题真是太神了! 只需要考虑被覆盖的次数的奇偶性,并且保证满足题意的点至多只有 ...

  6. HDU 4720 Naive and Silly Muggles 2013年四川省赛题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4720 题目大意:给你四个点,用前三个点绘制一个最小的圆,而这三个点必须在圆上或者在圆内,判断最一个点如 ...

  7. NGU-学习笔记(1)-动态添加删除图集

    现在 正在做unity的方向 不得不说我选的是UI方向 Unity中很有名的就是NGUI插件了.今天做了个ngui的简单背包系统.非常简陋..初学着 自己mark下 (1)预览 主要就是个 simpl ...

  8. BZOJ1015 [JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3895  Solved: 1750[Submit ...

  9. lightoj 1030 概率dp

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1030 #include<cstdio> #include<cstri ...

  10. 爬虫技术浅析 | z7y Blog

    爬虫技术浅析 | z7y Blog 爬虫技术浅析