我试图创建一个连接到多个数据库的.NET核心应用程序,但使用一个包含所有CRUD操作逻辑的通用存储库。实现此目标的最佳方法是什么?

    public Repository(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
        _set = _dbContext.Set<T>();
    }


上面是我的存储库的构造函数。在这里,我注入了ApplicationDbContext。我正在寻找一种使该ApplicationDbContext通用的方法,因此我只需要一个存储库,在其中可以注入不同的上下文来访问多个数据库。本质上,我正在寻找这样的东西:

public class Repository_1<T> where T:EntityBase
{
    public Repository_1(IDbContext dbContext)
    {

    }
}


我可以在其中换出dbContext并将其替换为连接到另一个数据库的另一个上下文。

最佳答案

您可以为存储库设置两个参数,并在其上添加约束,假设您的dbContext继承自DbContext

public class TestRepository<TContext, T> : ITestRepository<TContext,T>
    where TContext : DbContext
    where T : BaseEntity
{

    private readonly TContext _context;
    private DbSet<T> entities;


    public TestRepository(TContext context)
    {
        _context = context;
        entities = context.Set<T>();
    }



    public List<T> GetAll()
    {

        return entities.AsNoTracking().ToList();
    }
}


ITestReposiroty:

public interface ITestRepository<TContext,T>
    where TContext : DbContext
    where T : BaseEntity
{
    List<T> GetAll();
}


启动文件

services.AddScoped(typeof(ITestRepository<,>), typeof(TestRepository<,>));


控制器:

public class ProductsController : ControllerBase
{
    private readonly ITestRepository<ApplicationDbContext, Product> _repository;

    public TestRepoController(ITestRepository<ApplicationDbContext, Product> repository)
    {
        _repository = repository;
    }
    // GET api/products

    [HttpGet]
    public List<Product> Get()
    {
        return _repository.GetAll();
    }
}

关于c# - 通过Entity Framework Core将多个数据库连接到.NET Core项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58123230/

10-10 13:45