gpt4 book ai didi

servicestack - ServiceStack 中的版本控制 - 再次

转载 作者:行者123 更新时间:2023-12-04 13:24:37 35 4
gpt4 key购买 nike

我读过@mythz 的这篇文章 https://stackoverflow.com/a/12413091/1095655 , 但我的声誉不够高,无法发表评论

我有一个问题正在工作。如果您收到带有版本 1 DTO 的请求,则传输的数据中不存在该版本,因为版本 1 DTO 没有 Version 属性。当 ServiceStack 反序列化请求时,它会创建一个 DTO 对象(版本 3),版本设置为 2,并且由于未从传输的数据中接收到版本,因此版本不会像预期的那样覆盖为 0。正如我所见,您需要从一开始就在 DTO 中实现 Version,否则它将无法工作。

希望我错了,有人可以澄清我遗漏了什么?这可以解决吗,因为我在生产中有一个没有实现版本的 DTO?

最佳答案

是的,当您第一次添加 Version 信息时,这可能会很棘手,因为您希望在构造函数中包含版本号,以便在使用相同构造函数的同时为每个调用分配其隐式版本每当您反序列化为新的 DTO 时。

不幸的是,由于原始 DTO 中没有版本,因此它没有序列化到线路上,因此它永远不会覆盖隐式分配的版本字段。

要解决这个问题(并在构造函数中保留隐式分配的版本号),您需要有效地重置反序列化中使用的版本。

您可以使用 JSON/JSV 序列化器执行此操作,方法是覆盖 App_Start 上的 JsConfig.ModelFactory(即在您的 AppConfig 中),这允许您控制为反序列化中使用的每个 POCO 类型创建的实例。

在这种情况下,我们希望将任何具有版本号的 DTO 重置为 0,这样没有版本号的 DTO 将被分配 0,而具有版本号的 DTO 将被分配覆盖它:

 JsConfig.ModelFactory = type => {
if (typeof(IHasVersion).IsAssignableFrom(type))
{
return () => {
var obj = (IHasVersion)type.CreateInstance();
obj.Version = 0;
return obj;
};
}
return () => type.CreateInstance();
};

为了简单起见,我在这里使用显式 IHasVersion 接口(interface),但您也可以轻松地使用反射来检测和重新分配包含版本号的类型。

这是一个没有 Version 属性的原始 DTO 反序列化为具有隐式分配的版本号的 DTO 的示例:

public class Dto
{
public string Name { get; set; }
}

public interface IHasVersion
{
int Version { get; set; }
}

public class DtoV1 : IHasVersion
{
public int Version { get; set; }
public string Name { get; set; }

public DtoV1()
{
Version = 1;
}
}

现在,当您将原始 DTO 反序列化为较新的 DtoV1 时,它会保留为 0:

var dto = new Dto { Name = "Foo" };
var fromDto = dto.ToJson().FromJson<DtoV1>();
fromDto.Version // 0
fromDto.Name // Foo

如果您使用新的 DTO,它会填充版本号:

var dto1 = new DtoV1 { Name = "Foo 1" };
var fromDto1 = dto1.ToJson().FromJson<DtoV1>();
fromDto.Version // 1
fromDto.Name // Foo 1

关于servicestack - ServiceStack 中的版本控制 - 再次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13192442/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com