2011-05-26 57 views
0

继续从这个问题Good class design by example我有一个后续之一。如何创建一个对象“拥有”的集合?

我想创建一些其他对象拥有的集合。回顾一下,我有一个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()(或其他)?

我该如何更改我的代码来实现它?感谢您的期待。

+1

一个人有一个地址。我不知道一个地址应该有一个人。 – Marlon 2011-05-26 16:30:15

+1

保存自己的一些痛苦,使用仿制药 – Jodrell 2011-05-26 16:30:57

回答

2

如果你想通过一个人所拥有的地址,因人制宜包括地址的集合

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

不要忘记它新在构造函数中,

然后添加一个地址,你只是

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

校准 -

0

每个地址都应该保存()。你的地址可以保存,它会调用每个孩子的保存。

您可能希望拥有一个具有可枚举状态的基类,以便您可以有新的,修改的,未修改的和已删除的,以便您可以选择将调用CRUD的哪一部分。有些人把它分开,所以你会有布尔人,isNew,isModified,isDeleted。

+0

好的谢谢,是的有道理。任何关于某人的“所有权”的想法? – 2011-05-26 16:25:41

+0

如果两个人拥有相同的地址会怎样?你将有一个参考对象到同一个实例...如果你注意到ZIP改变了,那么它将改变所有与该地址相关联的人。你不想让父母拥有孩子。孩子们是他们自己的对象,最终可能有自己的孩子(也许我做了一个比喻)。 – SQLMason 2011-05-26 16:55:33

+0

对不起,我不明白你在问什么。正如埃里克所说,人将拥有一组地址。我没有注意到它在你的物体中缺失。 – SQLMason 2011-05-26 16:57:22

1

如果该人“拥有”地址,则应显示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); 
    } 
} 

如果您正在考虑良好的课堂设计,请考虑一下每个属性是否需要一个设置器。也许你希望你的对象不可变,在这种情况下你会想要私人设置者。

“Save”将遵循“ActiveRecord”模式。更常见的是,例如当使用像NHibernate这样的ORM时,你的对象会穿过一些声明它存储的边界。在NHibernate中,这被称为会话,它负责根据可用信息保存对象。

0

这取决于你的架构...但是,为了保存地址,我不会使用Address对象来完成它。这是你的POCO(普通的旧CLR对象),它不应该知道DAL。另一个类应该处理CRUD(Creat Read Update Delete)操作,它应该是业务层与DAL交互的部分。也许称之为AddressComponent.cs?这是一种领域模型模式方法。

对于地址集合,您可以按照flq的说法做,并将其作为属性...除非需要额外的逻辑,否则实际上不需要另一个名为Addresses.cs的对象。

0

我会使用泛型列表导出(或任何其他集合类)

// 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; 
     } 
    }  
} 
相关问题