Как получить все зарегистрированные DbContext (или сервисы) в ASP NET Core Inpendency Injection - PullRequest
0 голосов
/ 12 июня 2018

У меня есть сайт ASP.NET Core 2.1 с несколькими зарегистрированными DbContext и некоторыми условными строками соединения.

В целях отладки я хочу перечислить все зарегистрированные DbContext и их строку соединения, чтобы убедиться, что всехорошо сконфигурирован.

Это только «тестовая» функциональность, которая не используется для каких-либо других целей, поэтому, пожалуйста, не отвечайте «вы не должны этого делать», «это не шаблон» и т. д.

1 Ответ

0 голосов
/ 12 июня 2018

Я нашел способ сделать это.

В 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);
}
...