2

我需要在内存中建模一个集合 web 文件,但是它们之间的关系。也就是说,文件 A(例如 html)可能具有指向文件 B(例如 css)和文件 C(例如 javascript)的链接。文件 D 也可能需要文件 B。如果我想删除文件 AI 需要确保它使用的任何文件(例如文件 B)没有被另一个文件(例如文件 D)使用。也许是这样的:

  List<WebFile> list_of_webfiles

  public class WebFile
  - string url
  - bool parentFile

  public class FileRelationship
  - private WebFile parentWebFile;
  - private WebFile childWebFile;

问题 - 在 C# 中对此进行建模的最佳方法是什么?(例如,哪种集合类型和如何建模)

注意 - 它必须在内存中建模(无数据库),并且我也需要能够序列化为 XML 才能保存。我的意思的一个例子是看起来像这样的东西......

        XmlSerializer serializer = new XmlSerializer(typeof(List<WebFile>));
        TextWriter textWriter = new StreamWriter(CONFIG_FILE_PATH);
        serializer.Serialize(textWriter,  list_of_webfiles);
        textWriter.Close();

谢谢

4

2 回答 2

1

您有重复项(就需要 B 的多个文件而言)这一事实意味着将最明显的“需要”结构用作树会很痛苦,因为这将涉及多次嵌套 B(来自不同的父级)。几个选项:

  • 将对象引用保留在对象模型中,但仅在文件中列出名称(或其他一些引用);做起来相对简单,但需要在反序列化后进行修复
  • 仅列出关系中的名称(或其他引用),并将其镜像到对象模型中- 即“file.Parent”是键,而不是另一个对象
  • 拥有完整的对象模型,并使用图形序列化程序,例如DataContractSerializer启用保留对象引用

我可能会在最后两个之间进行选择;最后一个有“不是很漂亮”的 xml,但实现起来相对简单。但我很想只使用中间选项,并且只有对象模型中的关键引用,即

[XmlType("file"), XmlRoot("file")]
public class File {
    [XmlAttribute("name")]
    public string Name {get;set;}
    [XmlElement("ref")]
    public List<string> References {get;set;}
    public File() {References = new List<string>();}
}

也许不是纯粹的 OO,但做起来很简单。此外 - 避免重复数据的需要;如果您像上面一样存储它,您可以随时扫描以查看“使用此文件的内容”(如果需要,可以进行一些索引)。但是试图在两个方向上保持关系(即“UsedBy”)是一场噩梦。

于 2009-10-06T06:35:34.913 回答
1

这似乎暗示了您可能拥有的分层“树”关系

Class WebFile:
- URL : string
- Parent : WebFile
- Children : WebFile[] (could be a list depending on the need)

然后在某个地方你有一个

List<WebFile> webFiles;

这种方法可以很容易地遍历 web 文件树并找到相关文件,但更难列出所有文件本身。

或者,您可以单独存储文件和关系列表

Class WebFile
- URL : string

Class WebFileRelationship
- Parent : WebFile
- Child : WebFile

你有 2 个容器

List<WebFile> webFiles;
List<WebFileRelationship> relationships;

这种方法可以很容易地列出所有关系或所有文件,但很难确定单个关系。

这完全取决于您的应用程序,您是否需要有关单个文件或关系的更多信息?

于 2009-10-06T05:44:08.620 回答