如何合并SourceList<T>与SourceCache<T, TKey> 解决编译不通过问题
无法编译的原因
两个数据源返回的变化集泛型类型不匹配,Merge操作要求输入的可观测序列类型完全一致:
SourceList<IModel>.Connect()输出类型为IObservable<IChangeSet<IModel>>(无键的列表变化集)SourceCache<IModel, int>.Connect()输出类型为IObservable<IChangeSet<IModel, int>>(带键的缓存变化集)
正确实现方案
根据你需要的输出类型选择对应转换方式:
方案1:合并后输出无键列表变化集(适配SourceList的输出类型)
使用DynamicData内置的ToChangeSet()扩展方法,将带键的缓存变化集转换为无键的列表变化集后再合并:
using DynamicData; // 合并后的变化集类型为 IObservable<IChangeSet<IModel>> var mergedListChanges = sourceList.Connect() .Merge(sourceCache.Connect().ToChangeSet());
方案2:合并后输出带键缓存变化集(适配SourceCache的输出类型)
如果需要保留键结构,使用ToCacheChangeSet()扩展方法,传入和SourceCache一致的键选择器,将列表变化集转换为带键的缓存变化集后再合并:
using DynamicData; // 合并后的变化集类型为 IObservable<IChangeSet<IModel, int>> var mergedCacheChanges = sourceCache.Connect() .Merge(sourceList.Connect().ToCacheChangeSet(m => m.GetHashCode()));
注意:你当前使用
GetHashCode()作为缓存键存在风险:如果IModel的实现类没有重写GetHashCode方法,默认是基于引用地址计算哈希;如果实现类重写了哈希方法,还要注意哈希碰撞问题,两类情况都可能导致缓存的增删改操作出现异常,建议使用业务唯一标识作为缓存键。
内容的提问来源于stack exchange,提问作者sa.he
相关产品推荐
相关产品推荐

