根据UI逻辑设计数据传输对象

3

我在数据传输对象的情况下,开始认为自己过度架构或复杂化问题......

我不知道我是对还是错。

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

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

在AB情况下,我现在会创建一个SchoolWeekADTO和SchoolWeekBDTO。

考虑到DTO结构作为客户端和服务器之间的json接口,我的DTO结构并没有表达出何时需要A或AB数据。这让我感到很不好。

最重要的是,我的服务器API具有固定类型,因此我无法同时发送带有A-DTO和AB-DTO的Post。

你会怎么做?

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; }

    }

UI能改变StartWeek的值吗?如果可以,您需要动态获取AB数据的相关信息吗? - Aidin
问题1:是的,用户界面可以选择A或AB周类型。实际上我不需要什么...只是对我来说以dto的形式发送数据并在当前上下文中使用每个属性是有意义的。如果上下文是WeekType A,则拥有4个空属性甚至更多将它们变成Nullable<int>等都是没有意义的。 - Elisabeth
这是一个从客户端发送到服务器还是反过来的DTO吗? - Szymon
我个人从未遇到过这种情况,我认为这主要是因为我始终充分利用面向对象的设计,即使在我的DTO中也是如此。话虽如此,在我看来,DTO中具有空值属性是完全有效的。因为如果您的UI足够动态以更改类型,则应提供属性以绑定到UI字段。您可以在序列化中指定不包括JSON对象中的空值。 - Aidin
@Szymon 从客户端到服务器。 - Elisabeth
显示剩余2条评论
1个回答

0
为了避免发送所有对象并更好地标记客户端的意图,您可以将类型A和B的属性分别放入不同的类中。这样,您总是选择枚举值之一来表示类型是A还是B。基于此,您创建WeekTypeADTOWeekTypeBDTO的一个实例,并将另一个设置为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; }
}

1
哈哈,你很聪明地采用了我的代码和注释代码,并将其放在我建议的类名中:P 但这种方法至少比使4个AB属性成为可空类型要好... - Elisabeth
好的,依我看你已经接近成功了,所以我不想对你的代码做太多改动。 - Szymon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接