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