Rafy中的IOC
Rafy是什么可以通过下面博客来了解
Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署 - BloodyAngel - 博客园
以下是看源码中的一点记录,供以后学习使用
主要是Rafy中IOC容器的定义,实现方式,用法
下面先看一个图:
这个图片包含,三个方面的内容
- 以Composer为核心的组件组合器,实现组件间通信。
- 以IEventBus为核心的事件总线发布订阅机制。
- 以IObjectContainer为核心的IOC容器。
下面主要从IObjectContainer 接口开始
该接口,主要提供两大方面的功能
- 注册。
- 获取。
详细接口如下:
/// <summary>
/// 如果某个服务有多个实例,则可以使用此方法来获取所有的实例。
/// </summary>
IEnumerable<object> ResolveAll(Type type);
/// <summary>
/// 如果某个服务有多个实例,则可以通过一个键去获取对应的服务实例。
/// </summary>
object Resolve(Type type, string key = null);
/// <summary>
/// 注册唯一实例
/// </summary>
/// <param name="key">如果有必须,则传入实例的键。</param>
void RegisterInstance(Type type, object instance, string key = null);
/// <summary>
/// 注册唯一实例
/// </summary>
/// <param name="instanceType">唯一实例的类型,该类型的实例会在第一次使用时被创建。</param>
/// <param name="key">如果有必须,则传入实例的键。</param>
void RegisterInstance(Type type, Type instanceType, string key = null);
/// <summary>
/// 注册类型
/// </summary>
/// <param name="key">如果有必须,则传入实例的键。否则传入 null。</param>
void RegisterType(Type from, Type to, string key = null);
Rafy内部默认实现了一种IOC容器接口:
通过适配器模式,将IObjectContainer 适配到 IServiceContainer。
通过适配器模式将IUnityContainer适配到IObjectContainer
什么是UnityIOC 可以通过 深入理解IOC模式及Unity框架 - GavinJun - 博客园
来学习了解。
如果需要使用此种IOC则需要在Rafy环境启动,插件初始化的时候,将原有的IOC替换成UnnityIoc 替换方式如下:
这是怎么做到通过设置不同IOC工厂就可以替换IOC容器的呢?
ObjectContainerFactory.SetProvider(new UnityContainerAdapterFactory());
主要是上面这条语句,将Rafy 默认实现的 SimpleObjectContainer替换成了
UnityContainerAdapter
这样整个Rafy的IOC容器管理都有UnityContainerAdapter来接管了
首先我们看看ObjectContainerFactory里面是怎么控制的
这个里面比较简单
- 一个工厂接口的私有变量,来存储具体的容器工厂。
- 一个CreateContainer方法创建独立的容器
- 一个SetProvider方法,这个方法是什么鬼,好像没有它,我们就没法替换自己需要的IOC容器了,来具体看一下:
原来它只是把默认的工厂给替换掉了。
那如果我们也想用自己的工厂,替换自己的IOC容器,知道该怎么做了没有呢
首先
- 我们要实现 IObjectContainerFactory 这个工厂接口。
- 然后在合适的时机,调用SetProvider这个方法,这样就可以实现容器替换了。