gpt4 book ai didi

c# - 如何在单独的类库.net core 中使用 DbContext?

转载 作者:行者123 更新时间:2023-12-03 14:00:36 26 4
gpt4 key购买 nike

我正在尝试从类库中的 .net core 3.1 MVC 项目访问我的 dbcontext。目前我将我的数据库注入(inject)到 startup.cs 中的服务集合中。

public class AppDbContext : DbContext
{
public DbSet<User> Users {get; set;}
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{ }

protected override void OnModelCreating(ModelBuilder builder)
{
// Handles duplicate entry for email in user table
builder.Entity<User>()
.HasIndex(u => u.Email)
.IsUnique();
}
}

但是,我不确定如何在我的类库中访问这个 AppDbContext。我尝试像访问 Controller 一样访问它,但显然它不知道 DI 容器。

更多信息:
该库用于发出的常见请求。它必须始终与主 Web 应用程序分开,并且用户永远不必在此类库中编写代码。因此,我需要能够从类库访问主 Web 项目中的 dbcontext。

最佳答案

正如您所说,您正在开发类库以使用任何 DbContext通过图书馆的客户,那么您必须执行以下操作:
首先考虑您的类库具有以下接口(interface)和类,其中您的DbContext将会被使用:

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);
}
}
现在在您的类库中编写一个服务集合扩展方法,如下所示:
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));
}
}
现在在 Startup.ConfigureServices您的客户端应用程序如下:
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

.......
}
用法:
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();
}
}

关于c# - 如何在单独的类库.net core 中使用 DbContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59753218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com