我的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; }
}
答案 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();
}
}
}
}