c# - 根据ui逻辑设计数据传输对象

标签 c# dto data-transfer-objects

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

我不知道我是对还是错。

仅当在客户端 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。基于此你创建 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; }
}

关于c# - 根据ui逻辑设计数据传输对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914775/

相关文章:

c# - OpenXML 无法为单元格着色

c# - 选择一个好的字典键

c# ValueInjecter : Mapping the whole object Graph 收藏

c# - NHibernate 和 DTO

Java 数据传输对象命名约定?

.net - 复杂的DTO结构

c# - DTO 不应该知道业务对象中的枚举

c# - Nancy:从 "/"提供静态内容(例如 index.html)?

c# - MaxConcurrentCalls,如何告诉客户端其调用已排队? BasicHttp绑定(bind)

wcf - Entity Framework 代码优先 DTO 还是 UI 模型?