【发布时间】:2011-09-02 22:33:52
【问题描述】:
我已经搜索过这个问题的答案,甚至问了几个问题,但还没有真正找到正确的答案。如何将我的 POCO 域对象和服务中的验证方法暴露给 UI 层?目前我正在使用网络表单。
例如,我有以下域对象:
class Person
{
public string Name { get; set; }
public string Email { get; set; }
public bool IsValidEmail(string email) {}
public bool IsValidName(string name) {}
public bool IsValidPerson()
{
if (IsValidEmail(Email) && IsValidName(Name)) { return true; }
return false;
}
}
和域服务:
class PersonService
{
private Person person;
private PersonRepository pRepo;
public PersonService()
{
person = new Person();
pRepo = new PersonRepository();
}
public AddPerson(Person p)
{
if (p.IsValidEmail(p.Email) && p.IsValidName(p.Name) && !DoesEmailExistInDatabase(p.Email))
{ pRepo.Save(p); }
else
{ throw new ArgumentException(); }
}
public GetPersonByEmail(string email)
{
if (person.IsValidEmail(Email))
{ pRepo.GetByEmail(email)); }
else
{ throw new ArgumentException(); }
}
public bool DoesEmailExistInDatabase(string email) { //code if exists.. }
}
和 UI/代码隐藏层:
通过电子邮件获取联系人
string emailInput = EmailTextBox.Text;
PersonService pService = new PersonService();
Person p = new Person();
if(p.IsValidEmail(emailInput))
{
Person myPerson = pService.GetPersonByEmail(emailInput);
}
else
{
//give user error here...
}
为域对象中可能需要验证的每个属性创建单独的验证方法是否正确?
域对象和服务中的这些方法是否应该是静态的,这样我就不必创建人员实例来进行验证?
我是否应该在 Service 中公开来自 Person 域对象的验证,以便用户不需要知道在哪里寻找它们(因为我将一些服务和 POCO 中的一些确实是实施问题)?
4.有没有更好的办法?
【问题讨论】:
标签: c# asp.net validation architecture domain-driven-design