Операции с поздним связыванием не могут выполняться для типов или методов, для которых ContainsGenericParameters истинно. в .NET Core 3.1

Я попытался реализовать кэш в памяти, используя шаблон декоратора с универсальными классами в приложении.NET Core3.1. Там я получил следующее исключение времени выполнения.

System.InvalidOperationException: "Операции с поздним связыванием не могут выполняться для типов или методов, для которых ContainsGenericParameters истинно".

Найдите соответствующие классы, интерфейсы и методы, которые я для этого использовал.

    public interface IDataService<T> where T: class
    {
        ICollection<T> fetchData();
    }
 public class DataService<T> : IDataService<T>
        where T: class
    {
        private readonly IServiceProvider _serviceProvider;

        public DataService(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }

        public ICollection<T> fetchData()
        {
            using (var context = new ApplicationDBContext(_serviceProvider.GetRequiredService<DbContextOptions<ApplicationDBContext>>()))
            { 
                ICollection<T> result = context.Set<T>().ToList();
                return result;
            }
        }
    }
public class DataServiceCachingDecorator<T>: IDataService<T>
        where T: class
    {
        private readonly IDataService<T> _dataService;
        private readonly IMemoryCache _memoryCache;

        public DataServiceCachingDecorator(IDataService<T> dataService, IMemoryCache memoryCache)
        {
            _dataService = dataService;
            _memoryCache = memoryCache;
        }

        public ICollection<T> fetchData()
        {
            const string cacheKey = "data-key";

            if (_memoryCache.TryGetValue<ICollection<T>>(cacheKey, out var data))
            {
                return data;
            }

            data = _dataService.fetchData();
            var cacheEntryOptions = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(10));
            _memoryCache.Set(cacheKey, data, cacheEntryOptions);

            return data;
        }
    }

Класс ServiceExtensions - это статический вспомогательный класс для Startup. Соответствующий метод настройки кеша указан ниже. В этом методе я хочу связать тип с универсальными классами во время выполнения при создании экземпляров.

 public static void ConfigureCache(this IServiceCollection services)
        {
            services.AddMemoryCache();
            services.AddScoped(typeof(IDataService<>), typeof(DataService<>));
            services.AddScoped(typeof(IDataService<>), typeof(DataServiceCachingDecorator<>));

            var serviceProvider = services.BuildServiceProvider();
            var memoryCache = serviceProvider.GetService<IMemoryCache>();
            Type genericBase = typeof(IDataService<>);
            var cacheingDecoratorType = genericBase.MakeGenericType(typeof(DataServiceCachingDecorator<>));
            dynamic cacheingDecorator = Activator.CreateInstance(cacheingDecoratorType, memoryCache);
            cacheingDecorator.Add("fetchData");
}

Необходимо кэшировать несколько данных в разных таблицах. например: список клиентов

public class CustomerLogic
    {
        private IMapper _mapper;
        private readonly IDataService<Customer> _dataService;

        public CustomerLogic(IMapper mapper, IDataService<Customer> dataService)
        {
            _mapper = mapper;
            _dataService = dataService;
        }

        public IEnumerable<CustomerDto> GetCustomersList()
        {
            IEnumerable<CustomerDto> customersList = _dataService.fetchData().Select(_mapper.Map<Customer, CustomerDto>); 
            return customersList;
        }

Если кто-то знает, как решить эту проблему, дайте мне знать. Любая помощь приветствуется.

0 ответов

Другие вопросы по тегам