繁体   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