Chr*_*ris 0 .net nhibernate design-patterns domain-driven-design
我有一个员工在一个集合中拥有多个地址.
public class Employee
{
public string Name { get; set; }
public AddressCollection Addresses { get; }
}
public class AddressCollection : IEnumerable<Address>
{
private readonly Employee employee;
private IList<Address> items = new List<Address>();
public void AddAddress(Address address)
{
if (items.Contains(address)) return;
address.Employee = employee;
items.Add(address);
}
public void RemoveAddress(Address address)
{
items.Removce(address);
}
/// further IEnumerable implementations
}
public class Address
{
public AddressType Type { get; set; }
public City City { get; set; }
public string Street { get; set; }
public DateTime ValidFrom { get; set; }
public DateTime ValidTo { get; set; }
}
public enum AddressType
{
Default,
ShippingAddress
}
Run Code Online (Sandbox Code Playgroud)
某种类型中只有一个地址一次只能有效.因此,当在1-1-2009到15-1-2009之间添加类型默认有效地址,然后在10-1-2009到15-1-2009之间另一个类型默认有效的地址时,需要抛出异常.
从DDD的角度来看,最好的方法是什么?当然,在AddAddress方法中,我可以遍历现有地址并抛出异常.
但是,由于需要在表示层上检查此业务规则以向用户显示消息,因此我不应该使用内部以及表示层中可以使用的规范吗?
你怎么解决这个问题?
首先,我将摆脱您的AddressCollection类并在Employee上实现其成员.
为了验证这样的规则,我推荐规范模式.它不需要像维基百科文章那么复杂,它可以简单地:
public class CanAddAddressToEmployeeSpec
{
public bool IsSatisfiedBy(Address candidate)
{ // logic to check address }
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用该类检查在添加地址之前是否可以将地址添加到Employee中,以便您的Employee对象不会进入无效状态.我还经常将一个Messages属性添加到规范中,如果IsSatisifiedBy为false,则返回解释.
如果您需要更多信心,可以创建一个类似的规范,EmployeeAddressesAreValidSpec
将Employee作为IsSatisfiedBy的候选参数,并在持久化数据之前检查它.
归档时间: |
|
查看次数: |
756 次 |
最近记录: |