'How to use DBContextFactory in Generic Repository
My current application has three layers: Web, Infrastructure and Core. Generic Repository is in Infrasturcture layer and works fine with DBContext. After I switch to DBContextFactory, service can't start and system can out error:Error while validating the service descriptor 'ServiceType: Core.ServiceInterfaces.IBasCityService Lifetime: Scoped ImplementationType: Core.Services.BasCityService': Unable to resolve service for type 'Core.Interfaces.IGenericRepository`1[Core.Entities.BasCity]' while attempting to activate 'Core.Services.BasCityService' Generic Repository Class
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
protected readonly IDbContextFactory<DbContext> _DbFactory;
public GenericRepository(IDbContextFactory<DbContext> DbFactory)
{
_DbFactory = DbFactory;
}
public virtual async Task<T> GetByIdAsync(int id)
{
using var _dbContext = _DbFactory.CreateDbContext();
if (_dbContext is not null)
return await _dbContext.Set<T>().FindAsync(id);
else
return null;
}
.......
}
Service Class which is in Core layer
public class BasCityService : IBasCityService, IDisposable
{
private readonly IGenericRepository<BasCity> _cityRepository;
private readonly ISysExceptionLogService _exceptionLogService;
public BasCityService(IGenericRepository<BasCity> cityRepository,
ISysExceptionLogService exceptionLogService)
{
_cityRepository = cityRepository;
_exceptionLogService = exceptionLogService;
}
public async Task<BasCity> GetByIdAsync(int id)
{
try
{
return await _cityRepository.GetByIdAsync(id);
}
catch(Exception ex)
{
await _exceptionLogService?.CreateLogAsync(ex, null,
"BasCityService.GetByIdAsync()");
return null;
}
}
.........
}
if I inject DbContext instead of DBContextFactory in Generic Repository constructor or directly inject IDbContextFactory DbFactory in service constructor, everthing is fine. Is there any way I can use DBFactory in the Generic Repository instead of injecting DBFactory in service constructor? I want to keep my generic repository class. Thanks for your help
Solution 1:[1]
for this to work you need to setup something like builder.Services.AddTransient<IGenericRepository, GenericRepository>(); as it is a parameter of your constructor. – Brian Parker
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Frank |