Самостоятельная ссылка l oop при попытке использовать Hangfire - PullRequest
2 голосов
/ 17 марта 2020

Я разрабатываю веб-API в ASP. NET Core, и мы обнаружили, что нам нужно запустить фоновую задачу для операции массовой вставки. Однако модель, которую я вставляю, содержит свойство типа Geometry из . NET Topology Suite .

public class GeometricData
{
    //...

    public Geometry Geometry { get; set; }
}

Чтобы выполнить массовую вставку, я следую методу, который нашел здесь , и он довольно производительный c, но его реализация выходит за рамки этого вопроса. Несмотря на то, что это быстро, пользователь может вставить более одного миллиона записей в одну go, например, поэтому мы решили перенести эту обработку в фоновую задачу. Расширение Hangfire на первый взгляд выглядело как нечто, что могло бы сэкономить нам много времени, но, похоже, оно плохо справляется с типом Geometry. В приведенном ниже коде метод BackgroundTask также может быть пустым:

public Task BulkInsert(IEnumerable<GeometricData> list)
{
    BackgroundJob.Enqueue(() => BackgroundTask(list));

    return Task.CompletedTask;
}   

Просто актом передачи списка Geometry в качестве параметра BackgroundTask в действии для Enqueue выдаст досадную ошибку:

Self referencing loop detected for property 'CoordinateValue' with type 'NetTopologySuite.Geometries.Coordinate'. Path '[0].Geometry.Coordinates[0]'.

На самом деле Coordinates (класс NTS) действительно ссылается на себя:

enter image description here

Не знаю, почему они это сделали, но они сделали. Несмотря на это, до сих пор все работало просто отлично, но если мне не удастся найти решение этой проблемы (или даже, возможно, обойти ее), у меня возникнет куча проблем с внедрением фонового рабочего с нуля (я Я буду использовать Worker Service, если кому-то интересно). Есть указатели?

...