【发布时间】:2014-07-09 14:37:58
【问题描述】:
我有一个名为 country 的域实体,其结构如下
public class Country : Entity
{
public Country()
{
States=new List<State>();
}
public string CountryName { get; set; }
public string CountyCode { get; set; }
public virtual ICollection<State> States { get; private set; }
public void AddNewState(State state)
{
if(IsDuplicateStateExists(state.GetHashCode())) throw new ApplicationOperationException(Messages.Validation_DuplicateState){HttpCode = 409};
States.Add(state);
}
bool IsDuplicateStateExists(int hashCode)
{
return States.Any(x => x.GetHashCode() == hashCode);
}
public State GetStateById(int stateId)
{
return States.FirstOrDefault(x => x.Id == stateId);
}
public void DeleteState(int stateId)
{
var state = GetStateById(stateId);
if(state==null) return;
state.CountryId = 0; // This is for informing EF to delete this object Check Orphan entities in EF
States.Remove(state);
}
public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
if (CountryName.Length < 3) results.Add(new ValidationResult(Messages.Validation_CountryNameRequired,new String[]{"CountryName"}));
if (CountyCode.Length < 2) results.Add(new ValidationResult(Messages.Validation_CountryCodeRequired, new String[] { "CountyCode" }));
return results;
}
}
在这里,我对这个实体的设计几乎没有疑问, 1.) 实体可以抛出错误吗?
2.) 将验证(而非业务规则)逻辑放入实体中是否是个好主意
3.) “国家有州,每个州都必须有县”, 如果这是设计规范中的一条规则,Addnewstate(),IsDuplicateStatesExists(),RemoveStates () 有资格保留在国家实体内部,或者我应该转移到应用程序服务
【问题讨论】:
-
这是一个太多的问题,它可能属于程序员而不是 StackOverflow,后者更真实,更少概念。
-
@ArtB,几乎每个与 DDD 相关的问题都是基于意见的,因为它是一种模式,具有不同的实现风格。在这里,我根据少数给定的事实询问了我的实施是否正确。所有的问题都没有太大的不同,但都是相关的。
-
DDD 更加处理和开放,所以我想说程序员是更好的地方。不要误会我的意思,我喜欢你的问题,这不是恕我直言(而且不仅仅是我的)错误的地方。他们删除了标记问题以转移到程序员的选项,因此您必须自己做。
标签: asp.net-mvc domain-driven-design ddd-repositories