2012-01-11 27 views
0

POCO非常新,找到一些谷歌鏈接,但發現了許多不同的故事。一些與實體框架,延遲加載等相關聯。有些人說它是一個純粹的.det類。 Atleast MSDN。POCO - 如果POCO意味着純屬.net類只有屬性,我可以在MVC中編寫驗證

鏈接DEFINE POCO FROM MSDN: 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("[email protected]+\\..+", 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; } 

爲了達到這個水平,我很清楚。現在,如果我想用

ValidationAttribute 或

IValidatableObject

這將不是純粹的.NET類,如果我沒看錯的寫在MODEL 我自己的驗證(條件)。 例如......(類似下面)

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("[email protected]+\\..+", 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

POCOs意味着您不必從一些框架定義的基類繼承以實現功能。基本上你可以自由設計你的類層次結構。

您可以添加自己的方法,無論是驗證或一些業務邏輯。

一個反例將繼承EntityObject實體框架中的實體。

+0

那不是我的答案我在找什麼?你說的雙方(我可以添加邏輯和其他是不繼承類...),簡單的問題,是在MODEL的變化使它POCO或NONPOCO – 2012-01-11 10:50:06

+1

@amitpatel添加額外的方法不會讓你的POCO一個非 - POCO。 – Eranga 2012-01-11 10:53:52

2

鏈接的文章並沒有說POCO不能有方法。清楚地描述了什麼是POCO可以在Wikipedia發現:

...術語是用來對比的簡單對象有一個是 設計與複雜,特殊對象框架使用,例如 作爲一個ORM零件。另一種說法是,POCO是不受妨礙的對象,具有特定 框架所需的繼承或屬性。

POCO可以有你需要的所有方法或邏輯。 POCO和非POCO的不同之處在於即使您不使用特定框架(EF),POCO仍然是您可以始終使用的類,但非POCO只能在特定框架鏈接或更糟的初始化和使用時使用。

純粹主義者數據註釋也違反了POCO,因爲它們也要求特定的API,但是在實用的方法中,數據註釋是可以的(EF代碼中首先用於定義映射的特殊註釋除外),因爲它們僅依賴於實體的方式已驗證,但不依賴於實體持久化的方式(非POCO EF對象)。依賴於持久性可以要求引用EF組件中您不希望使用EF的程序集 - 例如像MVC應用程序這樣的表示層。

1

就我個人而言,我喜歡使用定義該模型所需的基本屬性來創建我的POCO部分類,然後將其放入單獨的類中並將其驗證邏輯。例如:

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

我知道的編譯器只是amalgamates兩類無論如何,你可能會重複屬性,但我認爲它最乾淨的方法。

另一個選項是使用MetadataType屬性。

相關問題