c# LINQ to SQL OnValidate()和自定义域模型类

更新时间:2024-05-09 下载TXT文档 下载Word文档

在遍历NerdDinner教程的过程中,我试图找到一种对不依赖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生成的类型。由于电子邮件表只是与域模型类(例如,"用户")相关的几个实体之一,因此理想的做法是创建"用户"域模型类,并使用"验证应用程序块"属性来验证属性。换句话说,我想使用这个:

public class User
{
    private Email emailEntity;

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

因此,如果我更改数据库架构,并且更改属于我的LINQ-to-SQL生成的类,那么我就没有这些孤立的子类(例如Email的子类)。我还想从集成Validation Application Block属性中受益,这样我就不必像NerdDinner教程中那样维护一组正则表达式。另外,作为域类的用户将成为域中的功能单元,而不是电子邮件和其他实体,用于创建视图模型,渲染视图等。但是,如果不执行以下操作,就无法捕获Validation调用:铅>

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();
    }
}

短码网-DuanMa.NET

然后让User挂接到该事件并处理User中的所有验证。甚至可以与Validation Application Block一起使用吗?

如何以合理的方式在诸如User之类的聚合域类中执行验证?

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

将验证作为服务而非实体的责任进行处理,这将使您可以将验证的实现与有效内容的定义分开,并将验证转换为显式操作而不是隐式操作(由L2S管理) 。

看看.net的流利验证(http://www.codeplex.com/FluentValidation),以很好地实现此方法。

  • 看起来可能效果很好-我将在本周末尝试解决这个问题。

以上就是短码网小编为大家整理的《c# LINQ to SQL OnValidate()和自定义域模型类》相关内容,希望大家喜欢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若内容造成侵权/违法违规/事实不符,请将联系本站反馈,一经查实,立即处理!

c# LINQ to SQL OnValidate()和自定义域模型类》文档下载仅供参考学习,下载后请在24小时内删除。

转载注明出处:https://www.duanma.net/article/5364c64f948.html

回到顶部