Операции с поздним связыванием не могут выполняться для типов или методов, для которых 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;
}
Если кто-то знает, как решить эту проблему, дайте мне знать. Любая помощь приветствуется.