如何配置控制器以返回null而不是Guid.Empty?

时间:2019-09-07 07:59:21

标签: c# asp.net-core asp.net-core-2.2

为了使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)做控制器的原因(如果可能的话)。

3 个答案:

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