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中的条件验证)。 通过示例寻找一个非常好的答案。
答案 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属性。