gpt4 book ai didi

c# - 寻找更好的设计 : A readonly in-memory cache mechanism

转载 作者:行者123 更新时间:2023-11-30 18:08:58 25 4
gpt4 key购买 nike

我有一个类别实体(类),它有零个或一个父类别和许多子类别——它是一个树结构。类别数据存储在 RDBMS 中,因此为了获得更好的性能,我想在启动应用程序时加载所有类别并将它们缓存在内存中。

我们的系统可以有插件,我们允许插件作者访问类别树,但他们不应该修改缓存项和树(我认为非只读设计可能会导致这个场景中的一些细微错误),只有系统知道何时以及如何刷新树。

下面是一些演示代码:

public interface ITreeNode<T>
where T : ITreeNode<T>
{
// No setter
T Parent { get; }
IEnumerable<T> ChildNodes { get; }
}

// This class is generated by O/R Mapping tool (e.g. Entity Framework)
public class Category : EntityObject
{
public string Name { get; set; }
}

// Because Category is not stateless, so I create a cleaner view class for Category.
// And this class is the Node Type of the Category Tree
public class CategoryView : ITreeNode<CategoryView>
{
public string Name { get; private set; }

#region ITreeNode Memebers

public CategoryView Parent { get; private set; }

private List<CategoryView> _childNodes;
public IEnumerable<CategoryView> ChildNodes {
return _childNodes;
}

#endregion

public static CategoryView CreateFrom(Category category) {
// here I can set the CategoryView.Name property
}
}

到目前为止一切顺利。 但是,我想让 ITreeNode 接口(interface)可重用,而对于其他一些类型,树不应该是只读的。我们不能用上面的只读 ITreeNode 来做到这一点,所以我希望 ITreeNode 是这样的:

public interface ITreeNode<T> {
// has setter
T Parent { get; set; }
// use ICollection<T> instead of IEnumerable<T>
ICollection<T> ChildNodes { get; }
}

但是如果我们让 ITreeNode 可写,那么我们就不能让 Category Tree 只读,这样不好。

所以我认为如果我们可以这样做:

public interface ITreeNode<T> {
T Parent { get; }
IEnumerable<T> ChildNodes { get; }
}

public interface IWritableTreeNode<T> : ITreeNode<T> {
new T Parent { get; set; }
new ICollection<T> ChildNodes { get; }
}

这是好事还是坏事?有没有更好的设计?多谢! :)

最佳答案

您可以尝试的一件事是对您希望只读的 IEnumerable 项目使用 List 。然后,当您填充树结构时,您可以在内部调用列表上的 AsReadOnly() 方法,该方法将返回一个 ReadOnlyCollection 并且您的数据的使用者将无法修改集合的内容。

从接口(interface)的角度来看,此方法不是ReadOnly,但尝试在集合上调用Add 之类的方法会失败并引发异常。

为了保护您的其他成员,您可以在类中的 ITreeNode 实现类中建立一些私有(private)只读标志,然后将您的标志设置为只读缓存项。

像这样的……


public class TreeNode : ITreeNode
{
private bool _isReadOnly;
private List<ITreeNode> _childNodes = new List<ITreeNode>();

public TreeNode Parent { get; private set; }

public IEnumerable<ITreeNode> ChildNodes
{
get
{
return _isReadOnly ? _childNodes.AsReadOnly() : _childNodes;
}
}
}

关于c# - 寻找更好的设计 : A readonly in-memory cache mechanism,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2816073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com