我遇到了数据传输对象的情况,我开始认为我过度架构或使事情复杂化......
我不知道我是对还是错。
仅当在客户端 UI 中选择 WeekType AB 时,才需要 EditSchoolyearDTO 中的所有属性。
当只选择 WeekType A 时,A 属性就足够了。
在 AB 案例中,我现在要创建一个 SchoolWeekADTO 和 SchoolWeekBDTO。
当我将 DTO 结构视为我的客户端和服务器之间的 json 接口(interface)时,我的 DTO 结构不表示何时需要 A 或 AB 数据。这对我来说很糟糕。
最重要的是,我的服务器 api 有一个固定的类型,所以我不能一次发送一个带有 A-DTO 的帖子,而在另一个时间发送一个 AB-DTO。
你会怎么做?
public class EditSchoolyearDTO
{
public string Name { get; set; }
public DateTime EndDate { get; set; }
public WeekType StartWeek { get; set; }
public enum WeekType : int
{
A = 0,
AB = 1,
}
public int UserId { get; set; }
public SchoolWeekADTO SchoolWeekA { get; set; }
public SchoolWeekBDTO SchoolWeekB { get; set; }
// When WeektType is A then only SchoolWeekA is or its A-properties are needed
// SchoolyWeekADTO
//public int MaxPeriodPerWeekA { get; set; }
//public IEnumerable<int> VisibleWeekDayIndexA;
//public DayOfWeek FirstDayOfWeekA { get; set; }
// SchoolWeekBDTO
//public int WeeklyRotation { get; set; }
//public DayOfWeek FirstDayOfWeekB { get; set; }
//public IEnumerable<int> VisibleWeekDayIndexB;
//public int MaxPeriodPerWeekB { get; set; }
}
最佳答案
为了不需要发送所有的对象,同时也更好的标示客户的意图,你可以将类型A和类型B的属性分离到不同的类中。这样你总是选择枚举的值之一来说明类型是 A 还是 B。基于此你创建 WeekTypeADTO
和 WeekTypeBDTO
之一的实例和将另一个设置为 null
。
代码看起来也更清晰,更好地表达了您的意图。
public class EditSchoolyearDTO
{
public string Name { get; set; }
public DateTime EndDate { get; set; }
public WeekType StartWeek { get; set; }
public enum WeekType : int
{
A = 0,
AB = 1,
}
public int UserId { get; set; }
public WeekTypeADTO SchoolWeekA { get; set; }
public WeekTypeBDTO SchoolWeekB { get; set; }
}
public class WeekTypeADTO
{
public int MaxPeriodPerWeekA { get; set; }
public IEnumerable<int> VisibleWeekDayIndexA {get; set;}
public DayOfWeek FirstDayOfWeekA { get; set; }
}
public class WeekTypeBDTO
{
public int WeeklyRotation { get; set; }
public DayOfWeek FirstDayOfWeekB { get; set; }
public IEnumerable<int> VisibleWeekDayIndexB {get; set;}
public int MaxPeriodPerWeekB { get; set; }
}
关于c# - 根据ui逻辑设计数据传输对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914775/