【问题标题】:LINQ to SQL: OnValidate() and custom domain model classesLINQ to SQL:OnValidate() 和自定义域模型类
【发布时间】:2009-09-19 23:42:03
【问题描述】:

通过NerdDinner Tutorial,我试图找出一种对不依赖于LINQ-to-SQL 生成的部分类的属性执行验证的好方法。这是我到目前为止所做的一些示例代码:

public abstract class DomainEntity
{
    public IEnumerable<ValidationError> ValidationErrors { get; private set; }

    public bool Validate()
    {
        bool isValid = false;

        if (this.ValidationErrors != null)
            this.ValidationErrors = null;

        this.ValidationErrors = this.GetValidationErrors();

        if (this.ValidationErrors.Count() == 0)
            isValid = true;

        return isValid;
    }

    protected abstract IEnumerable<ValidationError> GetValidationErrors();
}

public partial class Email : DomainEntity
{
    protected override IEnumerable<ValidationError> GetValidationErrors()
    {
        if (!this.ValidateAddress())
            yield return new ValidationError("Address", DomainResources.EmailAddressValidationErrorMessage);

        yield break;
    }

    partial void OnValidate(ChangeAction action)
    {
        bool isValid = this.Validate();

        if (!isValid)
            throw new InvalidEmailException(this);
    }

    private bool ValidateAddress()
    {
        // TODO: Use a regex to validate the email address.

        return !string.IsNullOrEmpty(this.Address);
    }
}

其中 Email 是基于 Email 表生成的 LINQ-to-SQL 类型。由于电子邮件表只是与域模型类(例如“用户”)相关的几个实体之一,因此理想的做法是创建一个“用户”域模型类并使用Validation Application Block 属性来验证属性。换句话说,我想用这个:

public class User
{
    private Email emailEntity;

    [EmailAddressValidator]
    public string EmailAddress
    {
        get { return emailEntity.Address; }
        set { emailEntity.Address = value; }
    }
}

因此,如果我更改了我的数据库架构,并且更改通过我的 LINQ-to-SQL 生成的类进行,我就没有这些孤立的部分类(如部分类电子邮件)。我还希望从集成验证应用程序块属性中受益,这样我就不必像在 NerdDinner 教程中那样维护正则表达式的集合。另外,作为域类的用户将成为域中的功能单元,而不是电子邮件和其他实体,用于创建视图模型、呈现视图等。但是,如果不执行以下操作,就无法捕获验证调用:

public abstract class DomainEntity
{
    public event EventHandler Validation(object sender, EventArgs args);
    protected void OnValidation()
    {
        if (this.Validate != null)
            this.Validate(this, EventArgs.Empty);
    }
}

public partial class Email
{
    partial void OnValidate(ChangeAction action)
    {
        this.OnValidation();
    }
}

然后让用户挂钩该事件并处理用户内的所有验证。这甚至可以与验证应用程序块一起工作吗?如何以合理的方式在像 User 这样的聚合域类中执行验证?

【问题讨论】:

  • 注意:我在数据库中有一个类似“用户”的表,但我说的是有一个 LINQ-to-SQL 独立类用户,它将从不同的表中提取。如果我更改架构(对其进行非规范化),则目标是仅更新 User 类以反映生成实体中的底层更改。

标签: c# asp.net-mvc linq-to-sql


【解决方案1】:

将验证视为一项服务而不是实体的责任,这将使您可以将验证的实现与有效的定义分开,并将验证转变为显式操作而不是隐式操作(由 L2S 管理) .

查看 .net (http://www.codeplex.com/FluentValidation) 的流利验证,以了解此方法的良好实施。

【讨论】:

  • 看起来它可能会很好用 - 我会在这个周末尝试解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2010-11-25
  • 1970-01-01
相关资源
最近更新 更多