簡體   English   中英

如何創建由 object “擁有”的集合?

[英]How to create a collection that is “owned” by an object?

繼this question Good class design by example之后,我有一個后續問題。

我想創建一些其他對象擁有的 collections。 回顧一下,我有一個Person class ,我希望這個Person能夠擁有一個或多個Addresses 所以我想我會創建一個Address class 和一個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() (或其他)?

我將如何更改我的代碼來實現它? 感謝您的關注。

如果你想要一個人擁有的地址,這個人應該包括一個地址集合

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

不要忘記在構造函數中新建它,

然后添加一個地址

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

卡爾-

如果 Person “擁有”地址,它應該公開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);
  }
}

如果您正在考慮良好的 class 設計,請三思而后行是否每個屬性都需要設置器。 也許您希望您的 object 不可變,在這種情況下您需要私有設置器。

“保存”將遵循“ActiveRecord”模式。 更常見的是,例如,當使用 ORM (如 NHibernate)時,您的 object 會跨越一些邊界,表明它已被存儲。 在 NHibernate 中,這稱為 Session,它負責根據可用信息保存 object。

我會使用 generics 來派生 List (或任何其他集合類)

// 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 中傳遞 object 本身:

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;
        }
    }       
}

每個地址都應該保存()。 你的地址可以保存它會調用它的每個孩子的保存。

您可能希望擁有一個具有可枚舉 Status 的基類,以便您擁有 New、Modified、UnModified 和 Deleted,以便您可以選擇將調用 CRUD 的哪一部分。 有些人將其拆分,因此您將擁有布爾值、isNew、isModified、isDeleted。

這取決於您的架構......但是,為了保存地址,我不會使用地址 object 來執行此操作。 這是您的 POCO(普通舊 CLR 對象),它不應該知道 DAL。 另一個 class 應該處理 CRUD(創建讀取更新刪除)操作,它應該是與 DAL 交互的業務層的一部分。 也許稱它為 AddressComponent.cs? 這是域 Model 模式方法。

對於地址收集,您可以按照 flq 的說明進行操作並將其作為屬性...除非您需要額外的邏輯,否則實際上不需要另一個名為 Addresses.cs 的 object。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM