- A+
framework目录下的,如果我没有猜错.它就是整个Ioc框架的底层了
目录位置:
先看看api中的枚举和接口
前三个文件
BinderExceptionType、BindingConst、BindingConstraintType都是枚举类型
①
CONFLICT_IN_BINDER:用于绑定操作冲突的时候发出异常。当同一个key绑定多个value使用了同一个name时
②
NULLOID:当Binding中name为null时,用这个常量代替
③
ONE:一个key只能对应一个value
Mant:一个key可以对应多个value
POOL:重构Binding应用Pool来代替SemiBinding存储数据
下面看看IBinder接口
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
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
去获取对应绑定好的实例
用于添加,移除,取出数据
这个是key,value,name数据类型的对应接口
它继承IManagedList,有了相应的操作数据的方法
constrain :束缚类型,unipueValue:第二层束缚
用于确定key,value,name是否可以是多个值
下面看一下实现
BinderException是自定义的异常类
SemiBinding实现ISemiBinding。前面说过了,它是key,value,name的抽象数据类型
objectValue用于保存数据,两个属性确定束缚,构造函数默认数值是唯一的,也就是说数组元素将会只有一个
——————
添加元素
①如果数组为空(没有初始化),或者束缚唯一。则初始化(或重构)数组长度为1
②如果有数据,并且束缚不唯一,先判断一下数据是否存在,存在直接返回。如果不存在,保存原有数据,重构数组大小+1,存储原有数据,在数组末尾添加新加元素
——————————
添加多个,这里不讲
————————
移除元素
①如果要移除的元素o与数组相等,或者数组本来就空。直接赋值数组为空(表示删除了),返回
②如果相等且不为空,遍历所有数组元素。判断与o相等的元素,相等就spliceValueAt(a)等过下标删除它。等下就回讲spliceValueAt这个方法
③都返回自身
——————
移除数组中指定位置的值
①新建一个长度少一的数组(万一原有数组为0,那不就是-1???)
②设置一个mod巧妙的将原有数组元素赋值给新数组。并将splicePos位置的元素删除。objectValue指向新的数组
——————
移除多个,这个也不说
——————————
取出值
①如果束缚是唯一的,那么返回null或数组的第一位
②如果不是唯一的,返回整个数组
下面是Binding,实现接口IBinding
①第一个是resolver是委托类型。这是一个方法,存储自己的方法,晚点Binder就会讲到。Binding有三个主要的东西,那就是key,value,name了。构造函数初始化为SemiBinding抽象的数据类型
②下面三个枚举束缚类型。默认规定key和value为唯一。name可以是多个
这些事Binding中定义的属性。这个不细说
——————————
只说最后一个name。前面已经说过了,如果name为空。那就用枚举BindingConst.NULLOID代替
————————
绑定key,其实就是将添加o为key的元素
——————————
绑定value和name
如果委托存在,调用它,在Binder字典中保存自己
————————
这些也不说了。一般都是直接调用数据类型的方法
Binder实现接口IBinder
两个字典一个用于保存所有的绑定,一个用于保存冲突了的绑定,第一个object为key,第二个object为name,IBinding就是Binding了,委托类型用于传递储存(解析)方法,构造函数直接初始化两个字典
————————
就是新建一个Binding,调用Binding的方法绑定key,返回Binding
解析Binding,存储Binding到字典中
①获得binding的key
②判断一下key束缚是不是唯一的。是的话直接解析
③不是的话,遍历所有的key,解析为同一个binding
下面看看ResolveBinding
①先检查是否有冲突(就是同一个key,不同的binding,同一个name)
如果有,用isConflictCleared判断是否可以清除冲突
主要就是判断同key不同binding有没有相同的name
如果可以清除,则调用clearConflict清除冲突
就是将key为key的字典的key为name的元素删除。最后再将外层字典key删除
②再检查bindingd字典中是否存在key了,不存在直接新建
③存在的话,就判断两个binding是否一样,不一样在判断他们的name,从而决定他们是否冲突
④如果冲突了,判断已存在的是否是weak,如果是移除它,覆盖它
如果不是,用registerNameConflict注册两个binding到conflict中
就是使用key对应一个以binding做key,name做value的字典,取出key的字典或新建,添加两个binding的值都为name
⑤移除name为空的binding(这个我猜是,空的也没用吧!再加上万一新加的name也是空呢,所以要移除)
⑥判断是否存在name再添加进字典,确定唯一
——————————
获取指定的binding
①如果含冲突,就抛出异常
②用key获取指定的字典,再用name获取到指定的binding
这里就不详细说了。无非就是定位到指定字典。移除字典的指定元素
通过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的关系