As you said you are developing the class library to use any DbContext passing by the client of the library then you have to do as follows:
First considering your class library has following interfaces and classes where your DbContext will be used:
public interface IUnitOfWork { IRepository<T> Repository<T>() where T : class; Task SaveChangesAsync(); } internal class UnitOfWork : IUnitOfWork { private readonly DbContext _dbContext; private Hashtable _repositories; public UnitOfWork(DbContext dbContext) { _dbContext = dbContext; } public IRepository<T> Repository<T>() where T : class { if (_repositories == null) _repositories = new Hashtable(); var type = typeof(T).Name; if (!_repositories.ContainsKey(type)) { var repositoryType = typeof(Repository<>); var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(typeof(T)), _dbContext); _repositories.Add(type, repositoryInstance); } return (IRepository<T>)_repositories[type]; } public async Task SaveChangesAsync() { await _dbContext.SaveChangesAsync(); } } public interface IRepository<TEntity> where TEntity : class { Task InsertEntityAsync(TEntity entity); } internal class Repository<TEntity> : IRepository<TEntity> where TEntity : class { private readonly DbContext _dbContext; public Repository(DbContext dbContext) { _dbContext = dbContext; } public async Task InsertEntityAsync(TEntity entity) { await _dbContext.Set<TEntity>().AddAsync(entity); } }
Now write a a service collection extension method in your class library as follows:
public static class ServiceCollectionExtensions { public static void RegisterYourLibrary(this IServiceCollection services, DbContext dbContext) { if (dbContext == null) { throw new ArgumentNullException(nameof(dbContext)); } services.AddScoped<IUnitOfWork, UnitOfWork>(uow => new UnitOfWork(dbContext)); } }
Now in the Startup.ConfigureServices of your client application as follows:
public void ConfigureServices(IServiceCollection services) { string connectionString = Configuration.GetConnectionString("ConnectionStringName"); services.AddDbContext<AppDbContext>(option => option.UseSqlServer(connectionString)); ServiceProvider serviceProvider = services.BuildServiceProvider(); AppDbContext appDbContext = serviceProvider.GetService<AppDbContext>(); services.RegisterYourLibrary(appDbContext); // <-- Here passing the DbConext instance to the class library ....... }
Usage:
public class EmployeeController : Controller { private readonly IUnitOfWork _unitOfWork; public EmployeeController(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } public async Task<IActionResult> Insert() { Employee employee = new Employee(); await _unitOfWork.Repository<Employee>().InsertEntityAsync(employee); await _unitOfWork.SaveChangesAsync(); return View(); } }