为了使ASP.Net Core 2.2 API前端开发人员的生活更轻松,我希望他们收到“空”而不是Guid.Empty值(在.net Core中定义为“ 00000000-0000-0000-0000- 000000000000“)。
通过创建这样的dto来实现此行为并不复杂:
public class ExampleDto
{
public Guid? Id { get; set; }
}
然后像这样映射它们
public static void MapExampleEntity(this AutoMapperProfile profile)
{
profile.CreateMap<ExampleEntity, ExampleDto>()
.ForMember(dto => dto.Id, o => o.MapFrom(e => e.Id == Guid.Empty ? null : e.Id);
}
但是,我觉得控制器应该可以通过某些配置来处理很多重复的任务。默认情况下是否可以实现此行为?
编辑以进一步说明我的问题(我收到了几个可行的解决方案,但我不认为它们中的任何一种都是100%干净的方法来实现我想做的事情):
我知道一般的做法是保留null,这也是为什么我不想用null污染代码的原因。我想将dto保持这种形式:
public class ExampleDto
{
public Guid Id { get; set; }
}
代替这种形式:
public class ExampleDto
{
public Guid? Id { get; set; }
}
避免进行无限的HasValue()检查。 Hovewer,我认为返回此信息的信息量和一致性要高得多(请参见customerId):
{
"Id": "b3431f4d-ef87-4fb5-83e0-995a9e7c9f6a",
"Name": "A001",
"Description": null,
"Currency": null,
"CustomerId": null,
"Customer": null,
"CountryIso": 2
}
比这个:
{
"Id": "b3431f4d-ef87-4fb5-83e0-995a9e7c9f6a",
"Name": "A001",
"Description": null,
"Currency": null,
"CustomerId": "00000000-0000-0000-0000-000000000000",
"Customer": null,
"CountryIso": 2
}
这是当前行为。这就是我想让Guid.Empty => null映射代替控制器(而不是AutoMapper)做控制器的原因(如果可能的话)。
答案 0 :(得分:3)
好吧,不知道为什么我在问这里之前没有找到这个解决方案,但是我觉得在这里写它(因为我已经问过这个问题)对于将来可能遇到相同问题的开发人员来说是适当的。 / p>
确实可以格式化控制器输出而无需手动检查每个Dto中的值或将AutoMapper行添加到其映射配置中!
首先从JsonConvert派生的创建类,如下所示:
public class NullGuidJsonConverter : JsonConverter<Guid>
{
public override void WriteJson(JsonWriter writer, Guid value, JsonSerializer serializer)
{
writer.WriteValue(value == Guid.Empty ? null : value.ToString());
}
public override Guid ReadJson(JsonReader reader, Type objectType, Guid existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var value = reader.Value.ToString();
return reader.Value == null ? Guid.Empty : Guid.Parse(value);
}
}
然后将此类添加到Startup.cs的Mvc设置中
services.AddMvc()
.AddJsonOptions(options =>
options.SerializerSettings.Converters.Insert(0, new NullGuidJsonConverter()))
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
就是这样!控制器现在正在处理从Guid.Empty值到null的转换!
答案 1 :(得分:0)
Guid是一种您已经知道的值类型。如果要发送null而不是Empty Guid,则可以检查ActualCustomerId == Guid.IsEmpty,如果为true,则CustomerId = null。否则,正如您所说的,Nullable类型是可行的方法。抱歉,如果这不是您想要的。这意味着您将需要检查Guid是否为空,如果为空,则将null设置为CustomerId。
答案 2 :(得分:0)
尝试:
public class ExampleDto
{
public Guid? Id { get{ return Id == Guid.Empty ? null : Id; } set; }
}