C# 将部分填充的DTO映射到域对象

C# 将部分填充的DTO映射到域对象,c#,wcf,web-services,dto,C#,Wcf,Web Services,Dto,我在我的业务层和表示层之间使用DTO,并且在服务中有一些将DTO转换为域对象的映射代码。我目前允许PL部分填充DTO并将其发送到更新服务,该服务只更新关联DO上更改的属性 在部分填充的DTO中,处理不可为空(值)类型的常用方法是什么?对于可为null的类型,我只检查DTO值是否为null,如果不是,则在DO上设置相应的值。但是非nullables将始终包含一个值,该值可能是PL设置的,也可能不是PL设置的 我可以: 将DTO中的自由格式字符串用于概念上的值类型属性,并与值类型进行转换 使PL调

我在我的业务层和表示层之间使用DTO,并且在服务中有一些将DTO转换为域对象的映射代码。我目前允许PL部分填充DTO并将其发送到更新服务,该服务只更新关联DO上更改的属性

在部分填充的DTO中,处理不可为空(值)类型的常用方法是什么?对于可为null的类型,我只检查DTO值是否为null,如果不是,则在DO上设置相应的值。但是非nullables将始终包含一个值,该值可能是PL设置的,也可能不是PL设置的

我可以:

  • 将DTO中的自由格式字符串用于概念上的值类型属性,并与值类型进行转换
  • 使PL调用成为服务方法,以更新值属性,而不是通过DTO传递它们
  • 强制PL始终向更新服务发送完全填充的DTO
这些似乎都不理想:有没有我错过的选择?还是我从错误的角度看待这个问题


如果相关的话,我正在使用C#4、WCF和ASP.NET MVC

您能提供更多关于您提到的不可为空值类型的信息吗?您是否意识到可以在DTO中使用该选项

一种方法是将更改的属性列表传递给更新服务。这可以是一个简单的整数,其中每个位表示某些属性或属性索引或名称的数组等。您还可以使DTO自我跟踪,即每个DTO将保持已更改的属性


我通常不喜欢这样的部分更新—如果允许这样的更新,那么IMO就应该创建一个复合DTO(将属性划分为子对象所拥有的属性组),其中客户端可以在组级别进行更新(即,必须填充组中的所有属性)。如果每个属性级别都需要更新控件,那么使用PropertyBag(名称/索引-值对字典)类型的DTO就更有意义了。

对于不可空类型,我指的是日期时间、枚举等。如果我在DTO中使用可空类型(例如DateTime?),这是一个通用的(非C#特定的)概念吗?尽管我在两端都使用.NET,但我希望该服务与客户端无关。即使在其他平台上,可空类型也可以跨网络工作。虽然性能有所下降(因为应为其他平台(如java)创建可空类型的包装器类),但它应该正常工作。另一种解决方案可能是一个额外的属性,用于指示相关属性的空状态。例如除了Amount之外,您还可以添加一个amountsnall属性来检查它是否为null。