Нужно предложение Сохранение коллекций в доменных объектах с использованием списка общих коллекций - PullRequest
0 голосов
/ 03 апреля 2011

Я хочу сделать этот метод с именем RegisterCollection с целью регистрации коллекции подобъектов в DomainObject.Идея состоит в том, что я хочу зарегистрировать коллекции в списке, чтобы при вызове Save () для моего DomainObject он вызывал save для каждого из подобъектов зарегистрированных коллекций.

Я сделал этот код, но я получаю эту ошибку при сборке: Тип аргумента 'OrderCollection' нельзя назначить типу параметра Collection .

Я использую C # с .Net 3.5.Я где-то читал, что тип преобразования, который не удается, поддерживается в .NET 4.0.Не уверен, что это правильно понято, но в любом случае, я надеюсь, у кого-то есть какие-то предложения относительно того, что еще нужно сделать или есть обходной путь.

Возможно ли это, возможно, с помощью CommandPattern какого-то рода?

Ответы [ 3 ]

0 голосов
/ 04 апреля 2011

Вам нужно вести список коллекций или вы можете заменить его простым списком IDomainObject?

Если это так, вы можете просто сделать RegisterCollection generic:

private readonly IList<IDomainObject> m_Collections = new List<IDomainObject>();

protected void RegisterCollection<T>(Collection<T> collection) where T : IDomainObject {
  foreach (var obj in collection)
    m_Collections.Add(obj);
}

Благодаря выводу типа вам не нужно указывать T и вы можете вызывать RegisterCollection с любой коллекцией классов, производных от IDomainObject.

РЕДАКТИРОВАТЬ: Хорошо, теперь я понимаю, почему вы хотите сохранить список. Другое решение, которое я могу придумать, - это создать собственный класс Collection с неуниверсальным базовым классом:

public abstract class DomainObjectCollection {
    public abstract void Save();
}

public class DomainObjectCollection<T> : DomainObjectCollection where T : IDomainObject {
    private readonly Collection<T> collection;

    public DomainObjectCollection(Collection<T> collection) {
        this.collection = collection;
    }

    public static implicit operator DomainObjectCollection<T> (Collection<T> collection) {
        return new DomainObjectCollection<T>(collection);
    }

    public override void Save() {
        foreach (var obj in collection)
            obj.Save();
    }
}

public class DomainObject : IDomainObject {
    private readonly IList<DomainObjectCollection> m_Collections = new List<DomainObjectCollection>();

    protected void RegisterCollection<T>(Collection<T> collection) where T : IDomainObject {
        m_Collections.Add((DomainObjectCollection<T>)collection);
    }

    /// <summary>
    /// Saves this instance collections.
    /// </summary>
    public virtual void Save() {
        SaveCollections();
    }

    private void SaveCollections() {
        foreach (var itemCollection in m_Collections) {
            itemCollection.Save();
        }
    }

}
0 голосов
/ 06 апреля 2011

Я думаю, что нашел способ обойти.Это не красиво, но работает.Дайте мне знать, что вы думаете.Предложения приветствуются.

Обратите внимание, что я использовал некоторые из ваших предложений Enzi для RegisterCollection.

Это позволяет мне сохранять общие элементы SaveCollections и добавлять дополнительные коллекции во время выполнения.

public class DomainObject : IDomainObject
{
    private readonly IList<IList> m_Collections = new List<IList>();

    protected void RegisterCollection<T>(List<T> collection) where T : IDomainObject
    {
        m_Collections.Add(collection);
    }

    public int Id { get; set; }

    /// <summary>
    /// Saves this instance collections.
    /// </summary>
    public virtual void Save()
    {
        SaveCollections();
    }

    private void SaveCollections()
    {
        foreach (var itemCollection in m_Collections)
        {
            foreach (var item in itemCollection))
            {
                ((IDomainObject)item).Save();
            }
        }
    }        
}


public interface IDomainObject
{
    /// <summary>
    /// Gets or sets the id.
    /// </summary>
    /// <value>
    /// The id.
    /// </value>
    int Id { get; set; }

    /// <summary>
    /// Saves this instance.
    /// </summary>
    void Save();

    /// <summary>
    /// Deletes this instance.
    /// </summary>
    void Delete();
}
0 голосов
/ 04 апреля 2011

Ваша проблема в том, что Collection<IOrder> не совместим с Collection<IDomainObject>, это до Ковариация и Контравариантность .

Представьте, что ваша коллекция IOrder, если она обработанакак список IDomainObject, тогда это позволит вам добавить любой IDomainObject в список, это означает, что я мог бы добавить ISomethingElse, если он получен из IDomainObject, ясно, что это было бы плохо..

...