我有一个基础的 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,但我不知道如何检测当前正在运行CmdLet的CmdletLoggerProvider类:
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;
}
}
}