POCO - 如果POCO意味着只有属性的纯.net类,我可以在MVC中编写验证

时间:2012-01-11 10:36:35

标签: asp.net-mvc-3 model-view-controller poco msdn

POCO非常新,找到一些谷歌链接,但发现了许多不同的故事。 一些与Entity框架,延迟加载等有关。有人说它是一个纯粹的.det类。 Atleast MSDN。

来自MSDN的定义POCO的链接: msdn.microsoft.com/en-us/library/dd456872.aspx

我信任MSDN(一个简单的定义),并假设它是一个纯.NET类。

现在让我谈谈这一点。 如果它是纯粹的.net类,其中只有属性,而不是MVC中“MODEL”的等边。 示例

 [Required(ErrorMessage = "Full Name  required.")]
    [StringLength(20, ErrorMessage = "Username must be under 20 chars.")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "Email required.")]
    [RegularExpression(".+@.+\\..+", ErrorMessage = "Email not valid.")]

    public string Email { get; set; }

    [Required(ErrorMessage = "PassWord required.")]
    [StringLength(20, ErrorMessage = "Maximum 20 chars. allow")]
    [DataType(DataType.Password)]
    public string Password { get; set; }

这个级别对我来说很明显。现在,如果我想在MODEL中编写自己的验证(条件) 使用

ValidationAttribute 或

IValidatableObject

如果我没有错的话,这将不是纯粹的.net类。 例子......(如下所示)

public class Wizard  : ValidationAttribute,IValidatableObject
{
    public override bool IsValid(object value)
    {
        return base.IsValid(value);
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        throw new NotImplementedException();
    }
    [Required(ErrorMessage = "Full Name  required.")]
    [StringLength(20, ErrorMessage = "Username must be under 20 chars.")]
    public string UserName { get; set; }

    [Required(ErrorMessage = "Email required.")]
    [RegularExpression(".+@.+\\..+", ErrorMessage = "Email not valid.")]

    public string Email { get; set; }

    [Required(ErrorMessage = "PassWord required.")]
    [StringLength(20, ErrorMessage = "Maximum 20 chars. allow")]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

这还是POCO吗? 如果是,它如何包含方法。(与MSDN链接相反) 如果不是,我应该在哪里写下我的验证码(当然还有MVC中的条件验证)。 通过示例寻找一个非常好的答案。

3 个答案:

答案 0 :(得分:3)

POCO意味着您不必从某个框架定义的基类继承以实现功能。基本上你可以自由设计你的类层次结构。

您可以添加自己的方法,无论是验证还是某些业务逻辑。

一个反例是从实体框架中的实体继承EntityObject类。

答案 1 :(得分:2)

链接文章并未说POCO必须没有方法。清楚说明可以在Wikipedia上找到POCO:

  

......这个术语用来对比一个简单的对象   旨在与复杂的特殊对象框架一起使用   作为ORM组件。另一种说法是POCO是对象   不受遗传或特定所需属性的影响   框架。

POCO可以拥有您需要的所有方法或逻辑。 POCO和非POCO之间的区别在于POCO是您可以使用的类,即使您不使用特定框架(EF),但只有在特定框架链接或更糟糕的初始化和使用时才能使用非POCO。 / p>

对于纯粹主义者而言,数据注释也违反了POCO,因为它们也需要特定的API,但在实用的方法中,数据注释是正常的(除了EF代码中首先用于定义映射的特殊注释),因为它们仅依赖于实体的验证方式但不依赖于实体的持久化方式(非POCO EF对象)。对持久性的依赖可能要求在你从不期望使用EF的程序集中引用EF - 例如表示层,如MVC应用程序。

答案 2 :(得分:1)

就个人而言,我喜欢使用定义该模型所需的基本属性,然后将逻辑放在一个单独的类中,使POCO成为部分类。 e.g:

public partial class Wizard
{
    public string UserName { get; set; }
    public string EmailAddress { get; set; }
}

然后如果我想向UserName添加验证:

public partial class Wizard
{
    [Required]
    [StringLength(20)]
    public string UserName { get; set; }
}

我知道编辑器只是合并了两个类,你可能会重复属性,但我认为它是最干净的方法。

另一种选择是使用MetadataType属性。