【发布时间】:2012-12-19 16:07:09
【问题描述】:
我在实现存储库接口的两个不同模型中有两个数据集合。其中之一是在一个非常适合存储库模型的平面列表中。另一个数据模型被格式化为树形结构,我构建的存储库接口的实现看起来很阴暗。我可以尝试展平第二个数据模型并仅使用对父级的引用,但目前该应用程序从能够以树结构获取数据中获得了一些巨大的好处。
我想知道是否有人有使用树状结构数据模型实现存储库模式的经验。目前在我的Get(Func<T, bool> predicate) 方法中,我使用递归方法展平列表并使用 LINQ 查询返回对象,但我觉得这种实现有点成本高昂。
任何关于如何实现这一点的提示将不胜感激。
这里是 get by predicate 方法的实现,如果这有助于说明实现的愚蠢之处。
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;博士
尝试用树状结构的数据实现存储库接口是不是很疯狂?
【问题讨论】:
-
您的问题的答案实际上取决于您的树的结构以及您实际查找数据的方式。你能提供更多细节吗?
-
GetAll 方法递归遍历子节点并将它们添加到列表中。
-
只是为了我的好奇:你为什么坚持把结构弄平?为什么存储库不能/不应该返回树状结构?
-
我希望 IRepository 的用户在获取所有项目时始终获得 IEnumerable。如果我为此 GetAll 方法实现一个特殊情况,我将无法对另一个扁平的数据结构使用相同的接口。
标签: c# tree repository-pattern