【发布时间】:2014-11-17 15:21:11
【问题描述】:
我想知道是否有更优雅的方式来管理个人的联系方式。暂时忘掉 SQL 方面吧,我很想知道如何尝试通过 DDD 方法来驱动它。
为了让 DDD 成为一个整体,我在胡闹一些代码,然后想出了以下看起来很糟糕的代码。
首先,我有一个名为 Person 的对象(为了本文的目的而进行了简化),我设想在其中添加和从本质上管理与个人交流的不同方法的方法。
public class Person
{
public Person()
{
this.ContactDetails = new List<ContactDetails>();
}
public void AssociateContactDetails(ContactDetails contactDetails)
{
var existingContactDetails = this.ContactDetails.FirstOrDefault(x => x.ContactType == contactDetails.ContactType);
if (existingContactDetails != null)
{
this.ContactDetails.Remove(existingContactDetails);
}
this.ContactDetails.Add(contactDetails);
}
public IList<ContactDetails> ContactDetails { get; private set; }
}
我想到了两种方法。一个我有一个相当简单的对象,比如下面这个非常通用的对象(松散地使用这个术语)。
public enum ContactType
{
Email, Telephone, Mobile, Post
}
public class ContactDetails
{
private readonly ContactType contactType;
private readonly string value;
public ContactDetails(ContactType contactType, string value)
{
this.contactType = contactType;
this.value = value;
}
public ContactType ContactType
{
get { return this.contactType; }
}
public string Value
{
get { return this.value; }
}
}
但是后来我用这种方法让自己陷入了困境,因为虽然它适用于诸如电子邮件和电话之类的琐碎项目,但当涉及到诸如邮政之类的东西时,字符串并不能完全解决它。因此,在此之后,我将走向让每种通信机制都由其自己的类型表示的方法,即:
public class Post
{
public Address PostalAddress { get; set; }
}
public class Mobile
{
public string MobileNo { get; set; }
}
public class Telephone
{
public string AreaCode { get; set; }
public string TelephoneNo { get; set; }
}
public class Email
{
public string EmailAddress { get; set; }
}
然后每种类型都可以表示为 Person 类中的集合或单个实例吗?似乎冗长但可能更具可读性和可维护性。
我想的问题是,是否有更优雅的方式来实现这样的功能,以及是否有人可以为我指出一个类似的好例子。我想这是需要克服的常见问题/问题。
干杯,DS。
【问题讨论】:
-
不确定为每种类型的联系信息设置不同的类会获得什么价值,只需在您的主要
ContactInfo类上创建属性,如果您愿意,可以将Address设为自己的类重新使用它。 -
是的,我有一个地址对象,它是一个值类型。但是,只看它是如何建模的。例如,我拥有的 Contact 对象我可以使用泛型,其中 T 可以是任何有意义的东西。
标签: c# domain-driven-design software-design