我有一个基础的 PowershellCmdLet
类,它构建了一个static IServiceProvider
. 从这个抽象派生的类CmdLet
然后利用IServiceProvider
for DI。因为IServiceProvider
is ,它会在每个 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
重新构建的性能影响......不值得。IServiceProvider
CmdLet
Powershell
我希望 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;
}
}
}