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. bzoj 3632: 外太空旅行 最大团

    3632: 外太空旅行 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 389  Solved: 129[Submit][Status] Descript ...

  2. Contest 20140708 testB dp 组合数

    testB 输入文件: testB.in  输出文件testB.out 时限3000ms 问题描述: 定义这样一个序列(a1,b1),(a2,b2),…,(ak,bk)如果这个序列是方序列的话必须满足 ...

  3. Microsoft HoloLens 技术解谜(上)

    HoloLens 是什么? HoloLens 是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素: 它是增强现实产品,即 Augmented Reality(AR),AR 技术将计算机生成的 ...

  4. 如何从代码层防御10大安全威胁中的 Xpath Injection?

    普遍性和可检测性: Xpath 注入是 OWASP TOP10 安全威胁中 A1 Injection 中的一种,注入漏洞发生在应用程序将不可信的数据发送到解释器时.虽然注入漏洞很容易通过审查代码发现, ...

  5. 【UVA12093】Protecting Zonk (树形DP)

    题意: 给定一个有n个节点的无根树,有两种装置A和B,每种都有无限多个.在某个节点X使用A装置需要C1的花费,并且此时与节点X相连的边都被覆盖.在某个节点X使用B装置需要C2的花费,并且此时与节点X相 ...

  6. Delphi 类成员的默认访问权限(用RTTI检测)

    类的成员,如果没有private.public等显示什么,直接在class下面,没有写访问权限的限定符,这种成员是不是默认的访问权限啊?还是publish的访问权限啊? --------------- ...

  7. [LeetCode#263]Factorial Trailing Zeroes

    Problem: Write a program to check whether a given number is an ugly number. Ugly numbers are positiv ...

  8. bzoj1820

    水dp,状态表示三个司机当前在哪所用最小耗油,因为有一个一定在当前点所以可以压掉一维 ..,..] of longint;     a:..] of longint;     x,y,i,j,k,n, ...

  9. 最棒的Visual Studio扩展

    isual Studio是微软公司推出的开发环境,Visual Studio可以用来创建Windows平台下的Windows应用程序和网络应用程序,也可以用来创建网络服务.智能设备应用程序和Offic ...

  10. canvas——画板

    注意部分: canvas的height和width不能再css中设定,应该在html中设定,否则会影响页面的分辨率. 效果图: 图1: 代码 css: #canvas{ cursor: crossha ...