Внедрение зависимости с PowerShell

Действительно ли возможно использовать Внедрение зависимости (DI) с Windows PowerShell?

Мои эксперименты intitial предполагают, что это не. Если я пытаюсь использовать Инжекцию Конструктора в 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");
    }
}

Если я добавляю конструктора по умолчанию, CmdLet может регистрироваться и использоваться, но без конструктора по умолчанию, это просто не доступно.

Я знаю, что мог использовать Сервисный Локатор для получения моих зависимостей, но я полагаю, что антишаблон так не хочет идти тем путем.

Я надеялся бы, что PowerShell API имел некоторый рычаг 'Фабрики', подобный ServiceHostFactory WCF, но если существует, я не могу найти его.

24
задан Mark Seemann 22 December 2009 в 10:46
поделиться

1 ответ

Экземпляр класса команд создается из пустого конструктора каждый раз, когда команда используется в PowerShell. Вы не можете контролировать, какой конструктор выберет PowerShell, поэтому вы не можете делать то, что предлагаете, простым способом (и мне действительно трудно представить, зачем вам это нужно). Итак, простой ответ на этот вопрос - NO.

Чтобы добиться подобного эффекта, вы можете сделать интерфейс, который выглядит как команда (имеет BeginProcessing/EndProcessing/ProcessRecord/StopProcessing) и использовать его для заполнения кучи команд, которые представляют собой тонкую обертку над реальным кодом. IMHO это было бы слишком сложным подходом.

Я действительно не понимаю, зачем вы это делаете. Не могли бы вы объяснить немного больше о сценарии?

10
ответ дан 29 November 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: