在看过Jimmy出色的关于制作邪恶域的视频之后,我尝试将同样的原则应用到我现有的一个项目中,以评估我对这个概念的理解有多好。我有疑问和疑问列在下面。
域名背景:管理员可以查看公司列表。然后他批准了一家公司。数据库应该将布尔字段更新为true,并存储批准该公司的用户的id。
最初,我在服务层中编写了以下代码。它将请求传递给存储库,存储库更新db中的适当字段,然后发送邮件通知。
public void ApproveCompany(int companyId, int userId)
{
_companyRep.ApproveCompany(companyId, userId);
//send mail to company representatives on successful approval.
}
为了创建丰富的域并在域类中封装逻辑,我创建了下面的内容。
public void ApproveCompany(int companyId, int userId)
{
var user = _userRep.GetById(userId);
var company = _companyRep.GetById(companyId);
user.Approve(company);
_companyRep.Insert(c);
//send mail to company representatives on successful approval.
}
public class AdminUser
{
public string Name { get; set; }
public void Approve(MyApprovedCompany c)
{
c.SetIsApproved(this);
}
}
public class Company
{
public bool IsApproved { get; private set; }
public AdminUser ApprovedBy { get; private set; }
public void SetIsApproved(AdminUser user)
{
if (this.IsApproved)
throw new Exception("This company has already been approved by user: " + user.Name);
this.IsApproved = true;
this.ApprovedBy = user;
}
}
查询:
或者,我可以按下面的方式编写服务层,但我认为这也不正确。
public void ApproveCompany(int companyId, int userId)
{
var user = _userRep.GetById(userId);
var company = _companyRep.GetById(companyId);
if(company.IsApproved)
{
throw new Exception("This company has already been approved by user: " + _userRep.GetById(company.ApprovedUserId).Name);
}
else
{
user.Approve(company);
_companyRep.Insert(c);
}
}
发布于 2015-05-21 16:00:08
这类问题几乎不可能得到正确的回答,但我可以从我所看到的情况告诉你:
company.Approve(adminUser)
。您可能会说,adminUser.approve(Company)
更好地反映了一个用例,比如“管理用户批准了一个公司”,但是您可以把它扭转过来,说“公司是由管理用户批准的”。还请注意,您所拥有的company.SetIsApproved
方法非常面向CRUD,并且肯定不能很好地反映您无处不在的语言。Company
不会只保留AdminUser
,只保留用户的ID。这样做,您的问题就消失了,您就减少了AR的大小。https://stackoverflow.com/questions/30352568
复制相似问题