2015-06-29 39 views
0

我有太相似的DTOs。使用nealy所有相同的屬性驗證創建和編輯DTO

它們僅在標識測試資源的一個屬性上有所不同。

現在當我創建,而不是EditAddTestDTO,使

public int<Nullable> TestId {get;set;} 

然後,我不能把RequireAttribute它,因爲它不會在創建的場景在哪裏工作我沒有TestId明顯。

你如何解決這個問題?

創建2個DTO,因爲我已經有了或AddEditBaseDTO?

public class EditTestDTO 
{   
    [Required] 
    public DateTime Date { get; set; } 
    [Required] 
    public int Number { get; set; } 
    [Required] 
    public int SchoolclassCodeId { get; set; } 
    [Required] 
    public int SchoolyearId { get; set; } 
    [Required] 
    public int TestTypeId { get; set; } 
    [Required] 
    public int TestId { get; set; } 
} 

public class CreateTestDTO 
{ 
    [Required] 
    public DateTime Date { get; set; } 
    [Required] 
    public int Number { get; set; } 
    [Required] 
    public int SchoolclassCodeId { get; set; } 
    [Required] 
    public int SchoolyearId { get; set; } 
    [Required] 
    public int TestTypeId { get; set; } 
} 
+0

首先 - 爲什麼你要創建一個應該需要的可空屬性? – Kamo

+0

因爲...「然後我不能把RequireAttribute放在它上面,因爲它不會在Create-Scenario中工作,我顯然沒有TestId。」 – Elisabeth

回答

2

我會避免共享一個基類。沒有什麼邏輯可以讓你在課堂上分享,讓它們保持清潔和簡單。

如果您想對兩種模型都使用相同的代碼,請改爲添加接口,然後讓兩個類實現它。這具有的優點是可以在與使用它的任何服務不同的項目中定義接口。

編輯:

你可能有這樣的事情,假設你只需要讀取你的業務接入,但它實際上取決於你需要訪問什麼樣的屬性:

public interface ITestDTO 
{ 
    DateTime Date { get; } 
    int Number { get; } 
    int SchoolClassCodeId { get; } 
    int SchoolYearId { get; } 
    int TestTypeId { get; } 
    int? TestId { get; } 
} 

public class EditTestDTO : ITestDTO 
{ 
    [Required] 
    public DateTime Date { get; set; } 
    [Required] 
    public int Number { get; set; } 
    [Required] 
    public int SchoolClassCodeId { get; set; } 
    [Required] 
    public int SchoolYearId { get; set; } 
    [Required] 
    public int TestTypeId { get; set; } 
    [Required] 
    public int TestId { get; set; } 

    int? ITestDTO.TestId { get { return TestId; } } 
} 

public class CreateTestDTO : ITestDTO 
{ 
    [Required] 
    public DateTime Date { get; set; } 
    [Required] 
    public int Number { get; set; } 
    [Required] 
    public int SchoolClassCodeId { get; set; } 
    [Required] 
    public int SchoolYearId { get; set; } 
    [Required] 
    public int TestTypeId { get; set; } 

    int? ITestDTO.TestId { get { return null; } } 
} 

可空TestId允許你區分編輯和創建您的服務。

+0

界面如何顯示? 5個屬性?相當的開銷? – Elisabeth

+0

感謝您的示例,但我不會將它用作太多開銷。屬性通常沒有邏輯和impl。因爲界面也是空的。我堅持KISS ;-) – Elisabeth

0

你可以創建一個抽象類TestDTO它包含了所有必要的屬性(但我相信我的編輯答案是更好,創造所有這些抽象的東西):

public abstract class TestDTO 
{ 

    public abstract DateTime Date { get; set; } 

    public abstract int Number { get; set; } 

    public abstract int SchoolclassCodeId { get; set; } 

    public abstract int SchoolyearId { get; set; } 

    public abstract int TestTypeId { get; set; } 
} 

然後就是實現性能的其他DTO或只是將這些屬性放置在您的CreateTestDTO中,並僅從EditTestDTO中派生出TestId屬性。

編輯:

那麼你可以有以下類型:

public class CreateTestDTO : TestDTO 
{ 
    [Required] 
    public DateTime Date { get; set; } 
    [Required] 
    public int Number { get; set; } 
    [Required] 
    public int SchoolclassCodeId { get; set; } 
    [Required] 
    public int SchoolyearId { get; set; } 
    [Required] 
    public int TestTypeId { get; set; } 

}

public class EditTestDTO : TestDTO 
{   
    [Required] 
    public DateTime Date { get; set; } 
    [Required] 
    public int Number { get; set; } 
    [Required] 
    public int SchoolclassCodeId { get; set; } 
    [Required] 
    public int SchoolyearId { get; set; } 
    [Required] 
    public int TestTypeId { get; set; } 
    [Required] 
    public int TestId { get; set; } 

}

另一種方法是驗證使用IValidatableObject接口模型並添加標誌,可在驗證過程中使用:

public class EditTestDTO : IValidatableObject 
{   
    [Required] 
    public DateTime Date { get; set; } 
    [Required] 
    public int Number { get; set; } 
    [Required] 
    public int SchoolclassCodeId { get; set; } 
    [Required] 
    public int SchoolyearId { get; set; } 
    [Required] 
    public int TestTypeId { get; set; } 

    public int? TestId { get; set; } 

    public bool IsEdit {get;set;} 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if(IsEdit) 
     { 
      if(!TestId.HasValue) 
      { 
       yield return new ValidationResult(); 
      } 
     } 
    } 
} 
+0

這將是兒童與基礎班之間的強大耦合。如果我必須在EditTestDTO中放置一個CreateTestDTO中不存在的屬性?那麼我註定了... – Elisabeth

+0

@Elisa - naah,你誤解了我。在這種情況下,您可以創建'TestDTO'並從'CreateTestDTO'和'EditTestDTO'中派生它。它使您能夠在兩個DTO中添加您喜歡的任何內容,而不會相互影響。我相信這種特殊情況下有一些奇特的模式 - 這一切都取決於你想看到的結果。 – Kamo

+0

但是,然後我的CreateTestDTO將只有基本屬性爲空。導出沒有內容的東西毫無意義? – Elisabeth

相關問題