ReadOnlyCollection дублирует в цикле - PullRequest
0 голосов
/ 29 марта 2019

У меня есть метод, который получает данные из внешнего ресурса, добавляет их в ReadOnlyCollection и возвращает эту коллекцию:

    public ReadOnlyCollection<TransactionDto> GetTransactions(int carrierId, DateTime beginDate, DateTime? endDate = null)
    {
        // call an external resource and save result to resultArray
        return _mapper.Map<ReadOnlyCollection<TransactionDto>>(resultArray);
    }

мой другой метод:

    public List<string> Run(DateTime startDate, DateTime endDate)
    {
        List<string> transactionsJson = new List<string>();
        foreach (var carrierId in carrierIds)
        {
            var transactions = efsService.GetTransactions(
                carrierId, startDate, endDate);

            if (transactions.Count > 0)
            {
                var transactionJson = JsonConvert.SerializeObject(transactions);
                transactionsJson.Add(transactionJson);
            }
        }
        return transactionsJson;
    }

проблема в том, если методGetTransactions возвращает записи для некоторого идентификатора carrierId, эта переменная типа ReadOnlyCollection будет возвращена для остатка carrierId в цикле.Это как кешированные данные.Почему так произошло?

Добавлено:

В ctor моего класса объявлено отображение:

        var config = new MapperConfiguration(cfg => cfg.AddProfile<AutoMapperTransactionProfile>());
        _mapper = config.CreateMapper();

Объявление AutoMapperTransactionProfile:

internal class AutoMapperTransactionProfile : AutoMapper.Profile
{
    public AutoMapperTransactionProfile()
    {
        CreateMap<WSTransaction, TransactionDto>();
        CreateMap<WSTransactionInfo, TransactionInfoDto>();
        CreateMap<WSTransactionLineItem, TransactionLineItemDto>();
    }
}

только один экземпляр _mapper используется в цикле

1 Ответ

0 голосов
/ 29 марта 2019

Удалить цикл for из метода и вызвать экстренный ресурс, чтобы получить детали транзакции только один раз.как показано ниже ...

public List<string> Run(DateTime startDate, DateTime endDate, int carrierId)
    {
        List<string> transactionsJson = new List<string>();

            var transactions = efsService.GetTransactions(
                carrierId, startDate, endDate);

            if (transactions.Count > 0)
            {
                var transactionJson = JsonConvert.SerializeObject(transactions);
                transactionsJson.Add(transactionJson);
            }

        return transactionsJson;
    }

Обновление:

Я смоделировал ваш код без картографа, он не возвращает записи о предыдущем carrierId.До сих пор не ясно, как вы объявили свой класс и как вы его составили.Для меня это выглядит как проблема в вашем картографе или службе, которая возвращает записи с предыдущего идентификатора носителя.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ReadOnlyCollection
{
    class Program
    {

        static List<Tuple<int, string>> transactions = new List<Tuple<int, string>>();

        static void Main(string[] args)
        {
            transactions.Add(Tuple.Create(1, "1"));
            transactions.Add(Tuple.Create(1, "11"));
            transactions.Add(Tuple.Create(2, "2"));
            transactions.Add(Tuple.Create(2, "12"));
            transactions.Add(Tuple.Create(3, "3"));
            transactions.Add(Tuple.Create(3, "13"));
            transactions.Add(Tuple.Create(4, "4"));
            transactions.Add(Tuple.Create(5, "5"));
            transactions.Add(Tuple.Create(6, "6"));

            Run(DateTime.Now, DateTime.Now);
        }

        public static List<string> Run(DateTime startDate, DateTime endDate)
        {
            var carrierIds = new List<int>() { 1,2,3,4,5,6};

            List<string> transactionsJson = new List<string>();
            foreach (var carrierId in carrierIds)
            {
                var transactions = GetTransactions(
                    carrierId, startDate, endDate);

                if (transactions.Count > 0)
                {
                    var transactionJson = JsonConvert.SerializeObject(transactions);
                    transactionsJson.Add(transactionJson);
                }
            }
            return transactionsJson;
        }

        public static ReadOnlyCollection<string> GetTransactions(int carrierId, DateTime beginDate, DateTime? endDate = null)
        {
            // call an external resource and save result to resultArray
            return new ReadOnlyCollection<string>(transactions.Where(item => item.Item1 == carrierId).Select(item => item.Item2).ToList());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...