【问题标题】:Design data transfer object depending on ui logic根据 ui 逻辑设计数据传输对象
【发布时间】:2013-11-11 19:58:36
【问题描述】:

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

我不知道我是对还是错。

只有在客户端 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; }

    }

【问题讨论】:

  • UI可以改变StartWeek的值吗?如果是,是否需要动态拉取AB数据的相关信息?
  • 问题1:是的,UI 可以在 WeekType A 或 AB 之间进行选择。我实际上什么都不需要……以 dto 的形式发送数据对我来说确实有意义,其中每个属性都在当前上下文中使用。如果上下文是 WeekType A,那么拥有 4 个为 Null 的属性是没有意义的,我必须将它们设为 Nullable 等...
  • 这是您从客户端发送到服务器的 DTO 还是相反?
  • 我个人从未遇到过这种情况,我认为这主要是因为我总是充分利用面向对象的设计,即使在我的 DTO 中也是如此。话虽如此,恕我直言,在 DTO 中拥有为空的属性是完全有效的。因为如果您的 UI 足够动态以更改类型,您应该提供绑定到 UI 字段的属性。您可以在序列化中指定在 JSON 对象中不包含 null 值。
  • @Szymon 从客户端到服务器。

标签: c# dto data-transfer-objects


【解决方案1】:

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

【讨论】:

  • 呵呵,你真聪明,把我的代码和注释代码放在我建议的类名中:P 但这种方法至少比让 4 个 AB 属性可以为空类型更好......跨度>
  • 好吧,在我看来,你几乎就在那里,不想过多地改变你的代码。
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2012-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多