具有处理序列化能力的集合存储库实现

本文关键字:集合 存储 实现 能力 处理 序列化 | 更新日期: 2023-09-27 17:59:00

我有几个集合,它们看起来都一样,但对不同类型的集合项进行操作,如下所示:

[CollectionDataContract(ItemName = "Culture")]
public sealed class Cultures : List<LangCult>
{
}

这里的重要代码是CollectionDataContract属性,它允许我们使用DataContractSerializer将此集合序列化为XML文件。整个集合被序列化为一个XML文件,命名为集合类类型的名称,例如Cultures.xml

我想提出一个存储库,确切地说是一个用于存储库的接口,它可以处理所有可能的集合,例如public class Slugs : List<string>

我试过这样的东西,但我不知道这是否是最好的选择:

public interface ICollectionsRepository<T> where T : IEnumerable

你的想法?

请不要回复如何序列化的说明,因为这不是这里的问题,我已经让它工作了

具有处理序列化能力的集合存储库实现

也许我应该说我想要一个带有泛型项的泛型集合接口,其中项有一个公共基类。这就是我解决问题的方法,希望有一天有人发现它有用。

/// <summary>
/// This repo enables us to work with serialisable collections. Collection class has
/// to inherit from IEnumerable and must be described with CollectionDataContract attribute
/// </summary>
/// <typeparam name="T"></typeparam>
public interface ICollectionsRepository<T, V> where T : Collection<V>
{
    /// <summary>
    ///     Get collection from datastore
    /// </summary>
    /// <returns>List of items</returns>
    T Load();
    /// <summary>
    ///     Add new collection item to datastore
    /// </summary>
    /// <param name="item">Item to be added to the collection</param>
    void Add(V item);
}
public class XmlCollectionsProvider<T, V> : ICollectionsRepository<T, V> where T: Collection<V>, new() where V: CollectionItem
{
    private readonly string _file = Path.Combine(XmlProvider.DataStorePhysicalPath, typeof(T).Name + ".xml");
    public T Load()
    {
        if (!DefaultsExist()) {
            CreateDefaults();
        }
        DataContractSerializer dcs = new DataContractSerializer(typeof(T));
        T obj = null;
        XmlDictionaryReader reader =
            XmlDictionaryReader.CreateTextReader(new FileStream(_file, FileMode.Open, FileAccess.Read),
                                                                                     new XmlDictionaryReaderQuotas());
        obj = (T)dcs.ReadObject(reader, true);
        reader.Close();
        return obj;
    }
    public void Add(V item)
    {
        T collection = Load();
        collection.Add(item);
        Save(collection);
    }
}
[CollectionDataContract(ItemName = "Culture")]
public sealed class Cultures : List<LangCult>   {   }
[DataContract]
public class LangCult : CollectionItem
{
    ...
}
[DataContract]
public abstract class CollectionItem
{
    [DataMember]
    public string Id
    {
        get;
        set;
    }
}