Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该将验证逻辑放入POCO中吗?_C#_Asp.net Mvc_Validation_Poco - Fatal编程技术网

C# 我应该将验证逻辑放入POCO中吗?

C# 我应该将验证逻辑放入POCO中吗?,c#,asp.net-mvc,validation,poco,C#,Asp.net Mvc,Validation,Poco,假设我有这样一个POCO: public class Name { public string FirstName { get; set; } public string LastName { get; set; } } FirstName和LastName不能为空。我是否应该添加如下方法: public List<Error> Validate() { var errors = new List<Error>(); if (Strin

假设我有这样一个POCO:

public class Name
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
FirstName和LastName不能为空。我是否应该添加如下方法:

public List<Error> Validate()
{
    var errors = new List<Error>();

    if (String.IsNullOrEmpty(FirstName))
        errors.Add(new Error("FirstName", "You must fill out first name."));
    if (String.IsNullOrEmpty(LastName))
        errors.Add(new Error("LastName", "You must fill out last name."));
}
public class Name
{
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
}
公共列表验证()
{
var errors=新列表();
if(String.IsNullOrEmpty(FirstName))
错误。添加(新错误(“名字”,“您必须填写名字”);
if(String.IsNullOrEmpty(LastName))
错误。添加(新错误(“姓氏”,“您必须填写姓氏”);
}

其中
Error
是一个包含
NameValueDictionary
的结构。这是一种好的做事方式吗?我可能会发现存储库存在问题,有人试图保存此POCO,但没有首先通过
Validate()
运行它。

考虑使用类似的面向方面的验证框架

不必将验证规则直接合并到代码中,您可以将它们添加为属性的属性,并卸载依赖关系。您的类将如下所示:

public List<Error> Validate()
{
    var errors = new List<Error>();

    if (String.IsNullOrEmpty(FirstName))
        errors.Add(new Error("FirstName", "You must fill out first name."));
    if (String.IsNullOrEmpty(LastName))
        errors.Add(new Error("LastName", "You must fill out last name."));
}
public class Name
{
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
}

为了更直接地回答您的问题,向POCO中添加验证规则是一种简单可行的方法,但维护起来可能会很麻烦,而且您需要在所有对象中强制执行验证接口,这是它自己的头痛问题。面向方面的解决方案是一个非常优雅的解决方案,可以解决这些问题和许多其他问题。

我不这么认为。我的POCO往往会根据其上下文进行不同的验证。“我的Person对象必须在此应用程序中有一个地址,但它们只需要在此其他应用程序中有一个电话号码”。。。这是一种你想要关注并灵活处理的事情

我是贫血领域模型的拥护者,因为我通常重用同一领域,但根据上下文(甚至可能是同一应用程序的不同区域)分配不同的行为和验证


在实现新功能时,我通常会查看我的类并问自己这样一个问题:这似乎是这个类的职责,还是更适合于具有不同职责集的类?我们称这种检查为“功能嫉妒”,它有效地帮助区分类是什么和不关心什么。

我发现在模型中进行验证没有什么错。它适用于所有Microsoft的UI技术,这些技术希望可以询问模型是否有效,并且您不会一直将一个数据映射到另一个数据,只会在视图或编辑模型中重复验证(或者更糟糕的是,只会将其放在那里)


示例中的规则很简单,但通常需要编写更复杂的规则。您可能应该查看Csla.Net框架

我以前研究过xVal,但发现明显缺乏文档和示例。现在我正在使用POCO,也许我会再次研究它。现在我想一想,如果需要更高级的验证,例如验证文件路径字符串指向硬盘上的物理文件,您将如何处理这些情况?xVal允许您创建自定义验证属性。这里有一个示例页面:谢谢,这对我帮助很大@Daniel T.-查看验证应用程序块(VAB)-您可以编写自定义验证程序并控制通过声明性XML应用的内容。非常同意您的第二段。这正是规则引擎变得流行的原因。贫乏的领域模型是无用的。最终,您会在任何地方重新编码相同的业务逻辑。根据Martin Fowler的说法,它实际上是一个反模式。贫血模型只不过是一个DTO。虽然评论很旧,但我认为添加一个链接会有所帮助。