0

我有一个基础的 PowershellCmdLet类,它构建了一个static IServiceProvider. 从这个抽象派生的类CmdLet然后利用IServiceProviderfor DI。因为IServiceProvideris ,它会在每个 Powershell sessionstatic中构建一次,而不是每次执行任何派生的 CmdLet 时。

各种服务包括一个带有Microsoft.Extensions.Logging.ILogger. 我希望这些服务发出的日志在 Powershell 会话中发出。例如,当ILogger.LogTrace()被调用时,我希望将其传递给CmdLet.WriteVerbose()方法。

CmdletLogger按照这些思路创建了一个类:

public CmdletLogger(Cmdlet cmdlet, string categoryName): ILogger
{
  // ILogger interface implemented, using cmdlet.Write* methods.
}

我想通过 提供一个CmdletLogger可用的IServiceProvider,但我不知道如何检测当前正在运行CmdLetCmdletLoggerProvider类:

public class CmdLetLoggerProvider : ILoggerProvider
{
    public ILogger CreateLogger(string categoryName)
    {
        // detect the currently running CmdLet here, so I can construct a CmdletLogger
    }
}

我意识到我可以制作IServiceProvider非静态的,并在连接日志记录时将其传递CmdLet给类,但是为单个会话中执行的每个执行CmdletLoggerProvider重新构建的性能影响......不值得。IServiceProviderCmdLetPowershell

我希望 Powershell 有类似的东西IHttpContextAccessor,但我一直没能找到这样的东西。

作为参考,抽象CmdLet类如下所示:

public abstract class QboCmdlet : PSCmdlet
{
    protected static ServiceProvider Services
    {
        get
        {
            if (_services == null)
            {
                _services = new ServiceCollection()
                    // other stuff here
                    .AddLogging(options =>
                    {
                        // todo: inject a CmdLetLogger, but we need a CmdLet; how to detect?
                        // options.AddProvider(new CmdLetLoggerProvider());
                    })
                    .BuildServiceProvider();
            }
            return _services;
        }
    }
}
4

0 回答 0