使用nealy所有相同的属性

时间:2015-06-29 07:42:27

标签: c# asp.net-web-api dto data-transfer-objects

我的DTO太相似了。

它们的区别仅在于标识Test资源的一个属性。

当我现在创建而不是EditAddTestDTO并创建

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

然后我不能把RequireAttribute放在它上面,因为它在Create-Scenario中不起作用,我没有明显的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; }
}

2 个答案:

答案 0 :(得分: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允许您区分服务中的编辑和创建。

答案 1 :(得分: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();
          }
      }
   }
}