Как создать коллекцию, которая «принадлежит» объекту? - PullRequest
0 голосов
/ 26 мая 2011

Исходя из этого вопроса Хороший дизайн класса на примере У меня есть дополнительный.

Я хочу создать несколько коллекций, которые принадлежат другим объектам.Напомним, у меня есть класс Person, и я хочу, чтобы Person мог иметь один или несколько Addresses.Поэтому я решил создать класс Address и коллекцию Addresses.Есть смысл?Вот мой код до сих пор

class Person
{
    public Person(int SSN, string firstName, string lastName)
    {
        this.SSN = SSN;
        FirstName = firstName;
        LastName = lastName;
    }

    public int SSN { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class Address
{
    public Address(string line1, string postCode)
    {
        Line1 = line1;
        PostCode = postCode;
    }

    public int ID { get; set; }
    public string Line1 { get; set; }
    public string PostCode { get; set; }
}

class Addresses : System.Collections.CollectionBase
{
    public int Person { get; set; } // should this be of type Person?

    public void Add(Address addy)
    {
        List.Add(addy);
    }

    public Address Item(int Index)
    {
        return (Address)List[Index];
    }

    public void Remove(int index)
    {
        List.RemoveAt(index);            
    }
}

Как я могу связать много адресов с человеком?Я хотел бы сделать что-то подобное в Main:

Person p = new Person(123,"Marilyn","Manson");
Address a = new Address("Somewhere", "blahblah");
p.Addresses.Add(a);

Затем я хочу сохранить адреса в базе данных.Должен ли я сделать Address.Save() или Addresses.Save() (или что-то еще)?

Как бы я изменил свой код для реализации этого?Спасибо за поиск.

Ответы [ 5 ]

2 голосов
/ 26 мая 2011

Если вы хотите, чтобы адреса принадлежали человеку, он должен включать коллекцию адресов

class Person 
{     
     <all the stuff you have>
     List<Address> Addresses;
}

Не забудьте добавить его в конструктор,

Затем добавитьадрес, который вы просто

Address addressInstance = new Address(){...};
PersonInstance.Addresses.Add( addressInstance );

Cal-

1 голос
/ 26 мая 2011

Если человек «владеет» адресами, он должен предоставить свойство Addresses. Это может быть тип ReadonlyCollection<Address> - нет необходимости создавать собственный тип коллекции.

public Person  {
  private List<Address> _addresses;
  public ReadonlyCollection<Address> Addresses {
    get { return _addresses.AsReadOnly(); }
  }
  public void AddAddress(Address address) {
    _addresses.Add(address);
  }
}

Если вы думаете о хорошем дизайне класса, подумайте дважды, нужно ли каждому свойству установщик. Возможно, вы хотите, чтобы ваш объект был неизменным, и в этом случае вам нужны частные сеттеры.

Это "Сохранить" будет следовать шаблону "ActiveRecord". Более обычно, например при использовании ORM, такого как NHibernate, ваш объект пересекает некоторую границу, которая утверждает, что он хранится. В NHibernate это называется Session, который заботится о сохранении объекта в соответствии с доступной информацией.

0 голосов
/ 23 июня 2016

Я бы использовал дженерики для получения списка (или любого другого класса коллекции)

// This class add just an Owner (parent) to the list
public class OwnedList<T> : List<T>
{
    public Object Owner { set; get; }

    public OwnedList(Object owner)
    {
        Owner = owner;
    }
}

И просто передайте сам объект в вашем классе:

class Contact
{
    public int Person { get; set; }

    private OwnedList<Address> _Addresses;
    public OwnedList<Address> Addresses
    {
        get
        {
            if (_Addresses == null)
            {
                _Addresses = new OwnedList<Address>(this);
            }
            return _Addresses;
        }

        set
        {
            _Addresses = value;
            _Addresses.Owner = this;
        }
    }       
}
0 голосов
/ 26 мая 2011

Это зависит от вашей архитектуры ... но для сохранения адреса я бы не использовал объект Address для этого. Это ваш POCO (Простой старый объект CLR), и он не должен знать о DAL. Другой класс должен обрабатывать операции CRUD (Creat Read Update Delete), и он должен быть частью вашего бизнес-уровня, взаимодействующего с DAL. Может быть, назвать это AddressComponent.cs? Это подход модели доменной модели.

Для набора адресов вы можете просто сделать так, как говорит flq, и иметь его как свойство ... на самом деле нет необходимости иметь другой объект с именем Addresses.cs, если вам не нужна дополнительная логика.

0 голосов
/ 26 мая 2011

Каждый адрес должен сохранять ().Ваши адреса могут сохранять, что будет вызывать сохранение для каждого из его дочерних элементов.

Возможно, вы захотите иметь базовый класс, который имеет перечисляемый статус, такой, что у вас будут New, Modified, UnModified и Deletedчто вы можете выбрать, какая часть вашего CRUD будет называться.Некоторые люди разделяют его так, чтобы у вас были логические значения: isNew, isModified, isDeleted.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...