Реализация репозитория коллекций с возможностью обработки сериализации - PullRequest
0 голосов
/ 11 июня 2011

У меня есть несколько коллекций, которые выглядят одинаково, но работают с разными типами элементов коллекции, например:

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

Важным фрагментом кода здесь является атрибут CollectionDataContract, который позволяет сериализоватьэта коллекция в XML-файл с DataContractSerializer.Вся коллекция сериализуется в один XML-файл с именем типа класса коллекции, например Cultures.xml

. Я хотел бы создать репозиторий, а именно интерфейс для репозитория, которыйбудет работать на всех возможных коллекциях, например public class Slugs : List<string>.

Я пробовал что-то подобное, но я не знаю, является ли это лучшим вариантом:

public interface ICollectionsRepository<T> where T : IEnumerable

Ваши мысли?

Пожалуйста, не отвечайте с инструкциями о том, как сериализовать, потому что это не проблема здесь, и у меня это работает.

1 Ответ

0 голосов
/ 24 июня 2011

Может быть, я должен был сказать, что мне нужен интерфейс для универсальной коллекции с общими элементами, где элементы имеют общий базовый класс.Вот как я решил это, и, надеюсь, кто-нибудь когда-нибудь найдет это полезным.

/// <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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...