3

我处于数据传输对象的情况,我开始认为我过度架构或使事情复杂化......

我不知道我是对还是错。

仅当在客户端 UI 中选择 WeekType AB 时,才需要 EditSchoolyearDTO 中的所有属性。

当只选择 WeekType A 时,A 属性就足够了。

在 AB 案例中,我现在将创建一个 SchoolWeekADTO 和 SchoolWeekBDTO。

好吧,当我将 DTO 结构视为客户端和服务器之间的 json 接口时,我的 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; }

    }
4

1 回答 1

0

为了不必发送所有对象并更好地标记客户端的意图,您可以将类型 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; }
}
于 2013-11-11T20:40:48.057 回答