具有处理序列化能力的集合存储库实现
本文关键字:集合 存储 实现 能力 处理 序列化 | 更新日期: 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;
}
}