【发布时间】:2013-10-16 15:23:03
【问题描述】:
背景:我有一个 Person 域对象。它是一个聚合根。我已经包含了以下课程的一部分。
我正在公开执行对象行为的方法。例如,要添加 BankAccount,我有 AddBankAccount() 方法。我没有包含该类的所有方法,但足以说明任何公共属性都必须使用方法进行更新。
我将创建一个 IPerson 存储库来处理 CRUD 操作。
public interface IPersonRepository
{
void Save(Person p);
//...other methods
}
问题:当我们更新现有人员时,如何告诉存储库哪些字段需要更新?例如,如果我向现有人员添加银行帐户,我如何在调用 repository.Save() 时将此信息传达给存储库?
在存储库中很容易确定何时创建新人,但是当现有人员存在并且您更新该人的字段时,我不确定如何将其传达给存储库。
我不想用更新哪些字段的信息污染我的 Person 对象。
我可以在存储库上使用单独的方法,例如 .UpdateEmail()、AddBankAccount(),但这感觉有点矫枉过正。我想在存储库上使用一个简单的 .Save() 方法,它可以确定需要以某种方式更新的内容。
其他人是如何处理这种情况的?
我已经搜索了网络和 stackoverflow,但没有找到任何东西。我一定没有正确搜索,因为当涉及到 DDD 范式中的持久性时,这似乎很简单。我对 DDD 的理解也可能离题了 :-)
public class Person : DomainObject
{
public Person(int Id, string FirstName, string LastName,
string Name, string Email)
{
this.Id = Id;
this.CreditCards = new List<CreditCard>();
this.BankAccounts = new List<BankAccount>();
this.PhoneNumbers = new List<PhoneNumber>();
this.Sponsorships = new List<Sponsorship>();
}
public string FirstName { get; private set; }
public string LastName { get; private set; }
public string Name{ get; private set; }
public string Email { get; private set; }
public string LoginName { get; private set; }
public ICollection<CreditCard> CreditCards { get; private set; }
public ICollection<BankAccount> BankAccounts { get; private set; }
public ICollection<PhoneNumber> PhoneNumbers { get; private set; }
public void AddBankAccount(BankAccount accountToAdd, IBankAccountValidator bankAccountValidator)
{
bankAccountValidator.Validate(accountToAdd);
this.BankAccounts.Add(accountToAdd);
}
public void AddCreditCard(CreditCard creditCardToAdd, ICreditCardValidator ccValidator)
{
ccValidator.Validate(creditCardToAdd);
this.CreditCards.Add(creditCardToAdd);
}
public void UpdateEmail(string NewEmail)
{
this.Email = NewEmail;
}
【问题讨论】:
-
嗨,我看到没有人真正回答你的问题。好吧,至少我不认为说“使用 ORM”是一种解决方案。你最后做了什么?
标签: domain-driven-design repository-pattern ddd-repositories aggregateroot