Azure Функции (устойчивые) - Тип является интерфейсом или абстрактным классом и не может быть создан - PullRequest
1 голос
/ 29 мая 2020

Проблема У меня есть приложение C# Durable Azure Functions (v2), содержащее функцию оркестровки и активности.

Оркестровка вызывает действие следующим образом:

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

Вызов работает нормально, и функция Activity выполняется, создает содержимое для propBag.CE и возвращает.

Объект 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);

Тот факт, что он содержит интерфейс, по-видимому, дает долговечные функции время выполнения проблема. Когда он пытается десериализовать значение, возвращаемое функцией действия, я получаю следующую ошибку:

Не удалось создать экземпляр типа Interfaces.Avaloq.Application.Models.CE.IParty. Тип - это интерфейс или абстрактный класс, и его нельзя создать.

Кто-нибудь знает, как это исправить? Может быть, есть способ настроить, как функция будет пытаться десериализовать json?

Обходной путь Я решил проблему, изменив класс, чтобы он содержал списки конкретных типов 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);
        }

Не очень красиво, но меня вокруг проблемы.

1 Ответ

2 голосов
/ 29 мая 2020

Похоже, вы столкнулись с этой проблемой на GitHub. В дополнение к обходному пути вы можете настроить параметры сериализатора, используемые Durable Functions, для включения информации о типе. Есть еще один пост StackOverflow , который описывает это и содержит пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...