- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
处理 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);
}
}
其中电子邮件是基于电子邮件表的 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 生成的类进行,我就没有这些孤立的部分类(如部分类电子邮件)。我还希望从集成验证应用程序 block 属性中获益,这样我就不必像在 NerdDinner 教程中那样维护一组正则表达式。另外,作为域类的用户将成为域中的功能单元,而不是电子邮件和其他实体,用于创建 View 模型、呈现 View 等。但是,如果不执行以下操作,就无法捕获验证调用:
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 挂接到该事件并处理 User 中的所有验证。这甚至可以与验证应用程序 block 一起使用吗?如何以合理的方式在聚合域类(如 User)中执行验证?
最佳答案
将验证视为一项服务而不是实体的责任,这将使您能够将验证的实现与有效定义分开,并将验证转换为显式操作而不是隐式操作(由 L2S 管理) .
查看 Fluent validation for .net ( http://www.codeplex.com/FluentValidation) 以获得此方法的良好实现。
关于c# - LINQ 到 SQL : OnValidate() and custom domain model classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1449809/
我正在尝试在 TClientDataSet 上的字段上编写 OnValidate 事件,类似于 procedure TForm8.ClientDataSet1MyFieldValidate(Sende
我最近做了一个自定义检查器,我刚刚意识到当我在检查器中编辑变量时,我的 OnValidate() 没有被调用。关于如何在保留我使用的自定义检查器的同时再次将我的调用返回到 OnValidate() 的
我通常将验证逻辑实现为: procedure TMyDM.IBQueryAMOUNTValidate( Sender: TField); begin inherited; if Sende
例如,我有一个带有 DBNavigator 和一些 DBEdit 的表单。 我想实现以下目标: 当用户在 DBEdit 中输入错误并想要切换到另一个控件时,应该显示警告,但他可以继续工作。 当用户想要
我正在尝试在网站上实现 Facebook 注册。如果没有 onvalidate 参数,一切都会像人们期望的那样工作,但是当包含它时,一切似乎都崩溃了(没有抛出错误,表单什么也不做)。 这是我的代码:
我想在我的 Linq 表类中实现这个分部方法。 partial void OnValidate(System.Data.Linq.ChangeAction action); 我希望它是在插入之前调用的
我的场景中有一个游戏对象作为实例预制件。我在 OnValidate 方法中添加了一个具有单一行为和验证逻辑的组件。但是我注意到当我处于预制模式时也会调用 OnValidate 方法。 所以我希望实例预
处理 NerdDinner Tutorial ,我试图找出一种对不依赖于 LINQ-to-SQL 生成的分部类的属性执行验证的好方法。这是我到目前为止所做的一些示例代码: public abstrac
我是一名优秀的程序员,十分优秀!