我在两个实现存储库接口的不同模型中有两个数据集合。其中一个是在一个与证书库模型非常吻合的平面列表中。另一个数据模型采用树形结构格式化,我构建的存储库接口的实现看起来非常阴暗。我可以尝试展平第二个数据模型,只使用对父项的引用,但是目前应用程序可以将数据作为树结构获得一些很大的好处。
如果有人有使用树结构化数据模型实现存储库模式的经验,我想知道什么。目前在我的Get(Func<T, bool> predicate)
方法中,我使用递归方法展平列表并使用LINQ查询返回对象,但我觉得这个实现有点代价。
有关如何实现这一点的任何提示将不胜感激。
这是get by predicate方法的实现,如果这有助于说明实现的sillines。
protected virtual IEnumerable<T> Get(Func<T, bool> predicate)
{
var objects = GetAll<T>();
return objects.Where(predicate);
}
编辑: 更多代码
private IEnumerable<TreeData> GetRecursiveObjects(TreeData object)
{
var allChildren = new List<TreeData>();
allChildren.AddRange(object.Children);
foreach (var child in object.Children)
{
allChildren.AddRange(GetRecursiveObjects(child).ToArray());
}
return allChildren;
}
protected virtual IEnumerable<T> GetAll<T>()
{
var objects = new List<T>();
objects.AddRange(Objects);
foreach (var object in Objects)
{
objects.AddRange(GetRecursiveObjects(object));
}
return objects.OfType<T>();
}
第二次编辑:
对于向存储库添加元素的好策略,我也有点困惑。我应该在使用代码中处理父元素的子元素的添加,还是存储库同时使用元素和对它的父元素的引用并处理整个添加操作?
TL;博士
尝试使用树结构中的数据实现存储库接口是不是很疯狂?
答案 0 :(得分:4)
您可以编写一个遍历树的方法,并使用迭代器块(IEnumerable<T>
)返回yield return
。
然后你不必创建树的内容的“平面”集合,你可以使用LINQ to Objects来应用你的谓词:
protected virtual IEnumerable<T> Get(Func<T, bool> predicate)
{
return WalkAll().Where( predicate );
}
实际上,在客户端代码枚举之前,甚至不会评估LINQ查询。