0

我也有非常相似的 DTO。

它们仅在标识测试资源的一个属性上有所不同。

当我现在创建一个 EditAddTestDTO 并制作

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

然后我不能把 RequireAttribute 放在它上面,因为它在我没有 TestId 的 Create-Scenario 中不起作用。

你如何解决这个问题?

创建我已有的 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; }
}
4

2 回答 2

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 允许您区分服务中的编辑和创建。

于 2015-06-29T08:28:11.597 回答
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时从中派生。EditTestDTOTestId

编辑:

然后你可以有以下课程:

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();
          }
      }
   }
}
于 2015-06-29T07:59:29.750 回答