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

标签 asp.net-core dependency-injection dbcontext

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

出于调试目的,我想列出所有已注册的 DbContext 及其连接字符串,以确保一切都已正确配置。

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

最佳答案

我找到了一种方法。

在 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);
}

关于asp.net-core - 如何在 ASP NET Core 依赖注入(inject)中获取所有已注册的 DbContext(或服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50816793/

相关文章:

c# - 如何在 Startup.cs 中使用通用类型注册接口(interface)

c# - 我只看到项目模板 blazorserver,为什么我看不到项目模板 blazor、blazorhosted、blazorlib、blazorserverside?

entity-framework - Entity Framework : One Database, 多个 DbContext。这是一个坏主意吗?

c# - 使用 DbContext Set<T>() 而不是在上下文中公开

javascript - 在asp.net core中添加JavaScript引用

c# - 从同一个表单同时保存多行 - dotnet core

java - Java中支持接口(interface)解析的Ioc/DI

dependency-injection - 原始类型和 IoC 容器

PHP 依赖注入(inject) - Pimple 等。 - 为什么使用关联数组与 getter?

c# - 具有 DbContext 的单例 - 在 Startup.cs 中创建实例