如何获取.net 8中所有已注册的dbContext?

问题描述 投票:0回答:1

我想做这样的事情, 但上下文始终为空:

public DbCheck(IEnumerable<DbContext> contexts)

背景:

public class c1( DbContextOptions<c1> options ) : DbContext( options )

报名:

    services.AddDbContext<c1>(      options => );
.net dependency-injection dbcontext
1个回答
0
投票

您可以尝试以下示例:
c1.cs(正确的连接字符串)

    public class c1 :DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Data Source=192.168.2.68;Initial Catalog=test123;User ID=sa;Password=Q!q11111;TrustServerCertificate=True");
        }
    }

c2.cs(错误的连接字符串)

    public class c2 : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Wrong string");
        }
    }

程序.cs

builder.Services.AddDbContext<c1>();
builder.Services.AddDbContext<c2>();

控制器

    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IServiceProvider serviceProvider;

        public ValuesController(IServiceProvider serviceProvider)
        {
            this.serviceProvider = serviceProvider;
        }

        [HttpGet("test")]
        public void test()
        {
            var type = typeof(DbContext);
            var types = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(s => s.GetTypes())
                .Where(p => type.IsAssignableFrom(p))
                .ToList();
       
            for (int i = 0; i < types.Count - 1; i++)
            {
                DbContext context_instance=(DbContext) serviceProvider.GetService(types[i]);

                   bool result=context_instance.Database.CanConnectAsync().GetAwaiter().GetResult();

                    Console.WriteLine(types[i].Name +" connect: "+ result);
            }           
        }
    }

测试结果

解释:
如果你检查“serviceprovider”中的所有服务,你会发现c1和c2不是从“DbContext”实现的,所以你无法直接从服务中通过“DbContext”找到它们。但你可以从组装中得到它们。 (与“IFruit”中的“apple”工具不同)。

© www.soinside.com 2019 - 2024. All rights reserved.