每个租户数据的GraphQL Dbcontext依赖项注入

时间:2019-04-27 18:25:59

标签: c# asp.net-core-mvc entity-framework-core graphql

我有以下使用IDatasourcerepository的类。

public class Project
{
    public int Id { get; set; }

    public string Name { get; set; }

    public async Task<IEnumerable<Datasource>> Datasource([Inject] IDatasourceRepository repository)
    {
        return Mapper.Map<Datasource[]>(await repository.GetDatasources());
    }
}

其定义如下。

public interface IDatasourceRepository
    {
        Task<IEnumerable<Datasource>> GetDatasources();
    }

和接口实现的类如下所示。

    public class DatasourceRepository : IDatasourceRepository
    {
        private readonly ProjectContext _context;

        public DatasourceRepository(ProjectContext context)
        {
            _context = context;
        }

        public async Task<IEnumerable<Datasource>> GetDatasources()
        {
            return await _context.Datasource.AsNoTracking().ToListAsync();
        }
    }

我的startup.cs有以下内容可供注入。

var projectConnection = @"Project connection string";
            services.AddDbContext<ProjectContext>(options => options.UseSqlServer(projectConnection));

            services.AddScoped<IDatasourceRepository, DatasourceRepository>();

我正在按以下方式获取Graphql数据。

{
    project {
        id,
        name,
        datasource {
            id,
            name
        }
    }
}

现在,数据源表在各自的数据库中是独立的(每个项目一个数据库)。

所以我需要传递它们各自的数据库连接。假设,对于Project 1,我有类似“ Initial Catalog = Project_1”之类的连接字符串。

那么,如何动态传递他们的项目连接字符串(或可以通过其创建连接字符串的项目ID)。这样我就可以从该数据库中获取所有数据源。

1 个答案:

答案 0 :(得分:0)

无需做太多编码。

只需为所有数据库的所需输出创建一个视图,然后将该视图映射到您的模型即可。

这是快速,流畅地报告的最佳方法。