使用PowerShell进行依赖注入

Mar*_*ann 25 powershell dependency-injection

是否可以在Windows PowerShell中使用依赖注入(DI)?

我的初步实验表明它不是.如果我尝试在CmdLet中使用构造函数注入,它甚至不会注册自己.换句话说,这是不可能的:

[Cmdlet(VerbsDiagnostic.Test, "Ploeh")]
public class PloehCmdlet : Cmdlet
{
    public PloehCmdlet(IFoo foo)
    {
        if (foo == null)
        {
            throw new ArgumentNullException("foo");
        }

        // save foo for later use
    }

    protected override void ProcessRecord()
    {
        this.WriteObject("Ploeh");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我添加一个默认构造函数,可以注册和使用CmdLet,但是没有默认构造函数,它根本就不可用.

我知道我可以使用服务定位器来检索我的依赖项,但我认为这是一种反模式,所以不想这样做.

我希望PowerShell API有一些类似于WCF的ServiceHostFactory的'Factory'钩子,但是如果有的话,我找不到它.

Sta*_*ing 10

每次在PowerShell中使用cmdlet时,都会从空构造函数创建cmdlet类的实例.您无法控制PowerShell将选择哪个构造函数,因此您无法以直接的方式执行您提出的建议(我真的很难想象您为什么要这样做).所以这个问题的简单答案是否定的.

为了实现类似的影响,您可以创建一个看起来像cmdlet的接口(具有BeginProcessing/EndProcessing/ProcessRecord/StopProcessing)并用于填充一堆cmtrats,这些cmdlet是真实代码上的瘦包装器.恕我直言,这将是一个过于复杂的方法.

我真的不明白你为什么要这样做.你能解释一下这个场景吗?

  • 可测试性是我的主要原因,但使用DI的任何理由同样适用于Cmdlet - 为什么它们应该与我的其余代码不同? (13认同)