StrangeIoc源码阅读-framework

  • A+
所属分类:StrangeIoc 原创文章

framework目录下的,如果我没有猜错.它就是整个Ioc框架的底层了

目录位置:

StrangeIoc源码阅读-framework

 


先看看api中的枚举和接口

StrangeIoc源码阅读-framework

 


前三个文件

BinderExceptionType、BindingConst、BindingConstraintType都是枚举类型

StrangeIoc源码阅读-framework
绑定异常枚举

CONFLICT_IN_BINDER:用于绑定操作冲突的时候发出异常。当同一个key绑定多个value使用了同一个name时

StrangeIoc源码阅读-framework
绑定使用的常量

NULLOID:当Binding中name为null时,用这个常量代替

StrangeIoc源码阅读-framework
Binding束缚种类

ONE:一个key只能对应一个value

Mant:一个key可以对应多个value

POOL:重构Binding应用Pool来代替SemiBinding存储数据

 


下面看看IBinder接口

StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework

IBinding Bind<T>() : 绑定类型T为key

IBinding Bind(object value);:绑定值value为key

IBinding GetBinding<T> () :通过类型T获取到Binding

IBinding GetBinding(object key):通过key值获取到Binding

IBinding GetBinding<T>(object name):通过类型T和标签获取到指定Binding

IBinding GetBinding(object key, object name):通过key值和标签获取到指定Binding

IBinding GetRawBinding() :生成一个Binding

void Unbind<T>():解除绑定key为T类型的Binding

void Unbind<T>(object name):解除绑定key为T类型且标签为name的Binding

void Unbind (object key):解除绑定为key的Binding

void Unbind (object key, object name):解除绑定key且标签为name的Binding

void Unbind (IBinding binding):解除Binding为binding的Binding

void RemoveValue (IBinding binding, object value):binding移除value

void RemoveKey (IBinding binding, object value):binding移除key

void RemoveName (IBinding binding, object value):binding移除name

void OnRemove():Binder的析构函数吧

void ResolveBinding(IBinding binding, object key):存储绑定的关联信息

 


下面再看看IBinder中一直使用的IBinding

StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework

IBinding Bind<T>();绑定T类型为key

IBinding Bind(object key);绑定object类型为key

IBinding To<T>();绑定T类型为value

IBinding To(object o);绑定object为value,可以是字符串和实例

IBinding ToName<T> ();绑定T类型为标签

IBinding ToName (object o);绑定object为标签

IBinding Named<T>();匹配类型T是否和Binding的值相等,是就返回Binding

IBinding Named(object o);匹配o是否和Binding的值相等,是就返回Binding

void RemoveKey (object o);移除key为o的key

void RemoveValue (object o);移除值为0的value

void RemoveName (object o);移除name为o的name

object key{ get; }

object name{ get; }

object value{ get; }

获取这个Binding的key,name,value

Enum keyConstraint{ get; set;}

Enum valueConstraint{ get; set;}

key,value的束缚枚举,是否允许多个

IBinding Weak();

bool isWeak { get; }是否是软弱的,可覆盖

 


下面是IInstanceProvider

StrangeIoc源码阅读-framework
两个方法为通过不同类型的key

去获取对应绑定好的实例

 


StrangeIoc源码阅读-framework
这个就有点像数据结构了

用于添加,移除,取出数据

 


StrangeIoc源码阅读-framework

这个是key,value,name数据类型的对应接口

它继承IManagedList,有了相应的操作数据的方法

constrain :束缚类型,unipueValue:第二层束缚

用于确定key,value,name是否可以是多个值

 


下面看一下实现

StrangeIoc源码阅读-framework

 


BinderException是自定义的异常类

StrangeIoc源码阅读-framework
这里不细说

 


SemiBinding实现ISemiBinding。前面说过了,它是key,value,name的抽象数据类型

StrangeIoc源码阅读-framework

objectValue用于保存数据,两个属性确定束缚,构造函数默认数值是唯一的,也就是说数组元素将会只有一个

——————

StrangeIoc源码阅读-framework

添加元素

①如果数组为空(没有初始化),或者束缚唯一。则初始化(或重构)数组长度为1

②如果有数据,并且束缚不唯一,先判断一下数据是否存在,存在直接返回。如果不存在,保存原有数据,重构数组大小+1,存储原有数据,在数组末尾添加新加元素

——————————

StrangeIoc源码阅读-framework

添加多个,这里不讲

————————

StrangeIoc源码阅读-framework

移除元素

①如果要移除的元素o与数组相等,或者数组本来就空。直接赋值数组为空(表示删除了),返回

②如果相等且不为空,遍历所有数组元素。判断与o相等的元素,相等就spliceValueAt(a)等过下标删除它。等下就回讲spliceValueAt这个方法

③都返回自身

——————

StrangeIoc源码阅读-framework

移除数组中指定位置的值

①新建一个长度少一的数组(万一原有数组为0,那不就是-1???)

②设置一个mod巧妙的将原有数组元素赋值给新数组。并将splicePos位置的元素删除。objectValue指向新的数组

——————

StrangeIoc源码阅读-framework

移除多个,这个也不说

——————————

StrangeIoc源码阅读-framework

取出值

①如果束缚是唯一的,那么返回null或数组的第一位

②如果不是唯一的,返回整个数组


下面是Binding,实现接口IBinding

StrangeIoc源码阅读-framework

①第一个是resolver是委托类型。这是一个方法,存储自己的方法,晚点Binder就会讲到。Binding有三个主要的东西,那就是key,value,name了。构造函数初始化为SemiBinding抽象的数据类型

②下面三个枚举束缚类型。默认规定key和value为唯一。name可以是多个

StrangeIoc源码阅读-framework

这些事Binding中定义的属性。这个不细说

——————————

StrangeIoc源码阅读-framework

只说最后一个name。前面已经说过了,如果name为空。那就用枚举BindingConst.NULLOID代替

————————

StrangeIoc源码阅读-framework

绑定key,其实就是将添加o为key的元素

——————————

StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework

绑定value和name

如果委托存在,调用它,在Binder字典中保存自己

————————

StrangeIoc源码阅读-framework

这些也不说了。一般都是直接调用数据类型的方法

 


Binder实现接口IBinder

StrangeIoc源码阅读-framework

两个字典一个用于保存所有的绑定,一个用于保存冲突了的绑定,第一个object为key,第二个object为name,IBinding就是Binding了,委托类型用于传递储存(解析)方法,构造函数直接初始化两个字典

————————

StrangeIoc源码阅读-framework

就是新建一个Binding,调用Binding的方法绑定key,返回Binding

StrangeIoc源码阅读-framework
其中resolver是个方法

StrangeIoc源码阅读-framework

解析Binding,存储Binding到字典中

①获得binding的key

②判断一下key束缚是不是唯一的。是的话直接解析

③不是的话,遍历所有的key,解析为同一个binding

下面看看ResolveBinding

StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework

①先检查是否有冲突(就是同一个key,不同的binding,同一个name)

如果有,用isConflictCleared判断是否可以清除冲突

StrangeIoc源码阅读-framework

主要就是判断同key不同binding有没有相同的name

如果可以清除,则调用clearConflict清除冲突

StrangeIoc源码阅读-framework

就是将key为key的字典的key为name的元素删除。最后再将外层字典key删除

②再检查bindingd字典中是否存在key了,不存在直接新建

③存在的话,就判断两个binding是否一样,不一样在判断他们的name,从而决定他们是否冲突

④如果冲突了,判断已存在的是否是weak,如果是移除它,覆盖它

如果不是,用registerNameConflict注册两个binding到conflict中

StrangeIoc源码阅读-framework

就是使用key对应一个以binding做key,name做value的字典,取出key的字典或新建,添加两个binding的值都为name

⑤移除name为空的binding(这个我猜是,空的也没用吧!再加上万一新加的name也是空呢,所以要移除)

⑥判断是否存在name再添加进字典,确定唯一

——————————

StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework

获取指定的binding
①如果含冲突,就抛出异常

②用key获取指定的字典,再用name获取到指定的binding


StrangeIoc源码阅读-framework
解除绑定

这里就不详细说了。无非就是定位到指定字典。移除字典的指定元素

 


StrangeIoc源码阅读-framework
StrangeIoc源码阅读-framework

StrangeIoc源码阅读-framework
通过binding去移除指定的key ,value ,name,都是通过binding找到对应的binding,调用它对应的方法,移除对应的SemiBinding的元素

 


总结

1.Binding由3个数据域key,value,name组成。它们都是SemiBinding类型的,是个object[]类型,还有一些操作方法

2.Binding和Binder中的绑定操作,对key,value,name的操作,一般都是返回Binding用于链式调用

3.Binder保存了所有的Binding,key和Binding和name的关系

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: