最近为了解决循环依赖,我们需要将枚举类移动到不同命名空间下的不同项目。有一些参与者和有状态服务将这个枚举值的实例保持在其可靠状态。
枚举类是这样的:
namespace com.libA
{
public enum Foo
{
None = 0,
Foo1 = 1,
Foo2 = 2,
}
}
我们想将其移动到另一个项目,其命名空间为com.libB
. 这些枚举值存储在参与者和有状态服务中的可靠状态中,并按如下方式获取:
Foo foo = await this.StateManager.GetStateAsync<Foo>("FooKey").ConfigureAwait(false);
存储价值的演员服务之一Foo
是非常长寿的演员。理论上,它可以在快乐的路径中存活到无穷大,并且永远不会从外部调用删除。我们尝试了简单的重构 > 移动并尝试了我们的非生产环境。这开始SerializationException
在我们的非产品环境中引起。错误消息说:
Expecting element 'Foo' from namespace 'http://schemas.datacontract.org/2004/07/com.libB'.. Encountered 'Element' with name 'Foo', namespace 'http://schemas.datacontract.org/2004/07/com.libA'.
这些异常发生在获取Foo
旧演员的价值之前。
我的问题是:
- 我们如何移动
Foo
到命名空间com.libB
?两阶段升级在这里会有帮助吗? - 甚至可以在没有数据丢失/损坏的情况下这样做吗?