Rafy中的IOC

Rafy是什么可以通过下面博客来了解

Rafy 领域实体框架演示(3) - 快速使用 C/S 架构部署 - BloodyAngel - 博客园

以下是看源码中的一点记录,供以后学习使用

主要是Rafy中IOC容器的定义,实现方式,用法

下面先看一个图:

                       

这个图片包含,三个方面的内容

  1. 以Composer为核心的组件组合器,实现组件间通信。
  2. 以IEventBus为核心的事件总线发布订阅机制。
  3. 以IObjectContainer为核心的IOC容器。

下面主要从IObjectContainer 接口开始

该接口,主要提供两大方面的功能

  1. 注册。
  2. 获取。

详细接口如下:

/// <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里面是怎么控制的

 

这个里面比较简单

  1. 一个工厂接口的私有变量,来存储具体的容器工厂。
  2. 一个CreateContainer方法创建独立的容器
  3. 一个SetProvider方法,这个方法是什么鬼,好像没有它,我们就没法替换自己需要的IOC容器了,来具体看一下:

原来它只是把默认的工厂给替换掉了。

 

那如果我们也想用自己的工厂,替换自己的IOC容器,知道该怎么做了没有呢

首先

  1. 我们要实现 IObjectContainerFactory 这个工厂接口。
  2. 然后在合适的时机,调用SetProvider这个方法,这样就可以实现容器替换了。
原文地址:https://www.cnblogs.com/gdnyfcuso/p/7518845.html