[英]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.