Azure Functions (Durable) - 类型是接口或抽象 class 且无法实例化

Azure Functions (Durable) - Type is an interface or abstract class and cannot be instantiated

问题 我有一个包含编排和 activity 函数的 C# Durable Azure Functions 应用程序 (v2)。

编排调用 activity 如下:

propBag.CE = await context.CallActivityAsync<CEData>(nameof(GetCEByExternalIdActivity), propBag);

调用正常,Activity 函数执行,构建了 propBag.CE 和 returns 的内容。

CE 对象包含一些其他对象,包括:

        public List<IParty> Individuals { get; set; }
        public List<IParty> Organisations { get; set; }

这些属性分配给如下:

        consPort.Individuals = await GetParties(clientRel.RelatedIndividuals, CEEntityType.Individual);
        consPort.Organisations = await GetParties(clientRel.RelatedOrganisations, CEEntityType.Organisation);

它包含接口这一事实似乎给 Durable Functions 运行时带来了问题。当它试图反序列化从 activity 函数返回的值时,出现以下错误:

无法创建类型 Interfaces.Avaloq.Application.Models.CE.IParty 的实例。类型是接口或抽象class,不能实例化

有人知道解决这个问题的好方法吗?也许有一种方法可以配置函数将如何尝试反序列化 json?

解决方法 我通过更改 class 以包含 IParty 的具体类型列表来解决该问题,如下所示:

        public List<Individual> Individuals { get; set; }
        public List<Organisation> Organisations { get; set; }

然后我必须确保在分配给这些属性之前从 IParty 转换为具体类型,如下所示:

var myList = (await GetParties(clientRel.RelatedIndividuals, CEEntityType.Individual));
        foreach (var party in myList)
        {
            consPort.Individuals.Add((Individual)party);
        }
        myList = (await GetParties(clientRel.RelatedOrganisations, CEEntityType.Organisation));
        foreach (var party in myList)
        {
            consPort.Organisations.Add((Organisation)party);
        }

不太好,但让我解决了这个问题。

看起来您 运行 喜欢 this issue on GitHub. In addition to your workaround, you can customize the serializer settings used by Durable Functions to include type information. There is another Whosebug post,它描述了这一点并有一个例子。