如何在 ASP NET Core 依赖注入中获取所有已注册的 DbContext(或服务)

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

我有一个 ASP.NET Core 2.1 站点,注册了几个 DbContext 和一些条件连接字符串。

出于调试目的,我想列出所有注册的

DbContext
及其连接字符串,以确保一切都配置良好。

这只是一个“测试”功能,不用于任何其他用途,所以请不要回答“你不应该这样做”、“这是反模式”等。

asp.net-core dependency-injection dbcontext
2个回答
5
投票

我找到了一种方法。

在Startup.cs中

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSingleton<IServiceCollection>(services);
}

然后,显示所有注册的服务:

StringBuilder sb = new StringBuilder();
foreach (ServiceDescriptor sd in _SvcCollection.OrderBy(s=>s.ServiceType.Namespace).OrderBy(s=> s.ServiceType.Namespace.StartsWith("System")?0:s.ServiceType.Namespace.StartsWith("Microsoft.")?1:2))
{
    // sb.Append(sd.ServiceType.FullName) is not easy to read
    sb.Append(sd.ServiceType.NameSpace).Append(sd.ServiceType.Name);
    if(sd.ServiceType.IsGenericType)
        sb.Append("<")
          .Append(String.Join(",", sd.ServiceType.GenericTypeArguments.Select(a => a.Name)))
          .Append(">");

    sb.Append(": ").AppendLine(sd.LifeTime);
}

显示所有使用其连接字符串注册的 DbContext:

StringBuilder sb = new StringBuilder();
foreach (ServiceDescriptor sd in _SvcCollection.Where(s => s.ServiceType.IsSubclassOf(typeof(DbContext))))
{
    sb.Append(sd.ServiceType.Name).Append(": ").AppendLine(((DbContext)HttpContext.RequestServices.GetService(sd.ServiceType))?.Database.GetDbConnection().ConnectionString);
}

0
投票

如果您在Program.cs中使用

顶级语句
(否则您可以使用不同的方法来查找所有类型,但要点保持不变),您可以执行以下操作:

using var scope        = app.Services.CreateScope();
var       contextTypes = builder.Services
                                .Where(sd => sd.ServiceType.IsAssignableTo(typeof(DbContext)))
                                .Select(sd => sd.ServiceType);

foreach (var contextType in contextTypes) {
    var dbContext = (DbContext)scope.ServiceProvider
                                    .GetRequiredService(contextType);

    dbContext.Database.Migrate();
}
© www.soinside.com 2019 - 2024. All rights reserved.