У меня есть другая перспектива ответить на это.
При работе на разных уровнях, например, в приложении MVC, контроллеру нужны службы для вызова бизнес-операций. В таких сценариях контейнер инжекции зависимостей может использоваться для инициализации служб, чтобы исключить исключение NullReferenceException. Это означает, что вам не нужно беспокоиться о проверке нулевого значения и просто вызвать службы с контроллера, как будто они всегда будут доступны (и инициализированы) как одиночный или прототип.
public class MyController
{
private ServiceA serviceA;
private ServiceB serviceB;
public MyController(ServiceA serviceA, ServiceB serviceB)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
}
public void MyMethod()
{
// We don't need to check null because the dependency injection container
// injects it, provided you took care of bootstrapping it.
var someObject = serviceA.DoThis();
}
}
Как указывает @Shay, FOO
необходимо определить для задания. Другой способ сделать это - использовать параметр -InitializationScript
для подготовки сеанса.
Для вашего примера:
$functions = {
function FOO { write-host "HEY" }
}
Start-Job -InitializationScript $functions -ScriptBlock {FOO}|
Wait-Job| Receive-Job
Это может быть полезно, если вы хотите использовать одни и те же функции для разных заданий.
Улучшение ответа @ Rynant:
Вы можете определить функцию как обычно в основной части вашего скрипта:
Function FOO
{
Write-Host "HEY"
}
, а затем переработать это определение в скриптблоке :
$export_functions = [scriptblock]::Create(@"
Function Foo { $function:FOO }
"@)
(имеет смысл, если у вас есть существенное тело функции), а затем передайте их на Start-Job
, как указано выше:
Start-Job -ScriptBlock {FOO} -InitializationScript $export_functions| Wait-Job | Receive-Job
Мне нравится этот путь, так как легче отлаживать задания, запуская их локально под отладчиком.
@ Предложение Rynant InitializationScript
велико
Я думал, что цель блоков (скриптов) состоит в том, чтобы вы могли их передавать. Так что, в зависимости от того, как вы это делаете, я бы сказал: «
$FOO = {write-host "HEY"}
Start-Job -ScriptBlock $FOO | wait-job |Receive-Job
Конечно, вы можете также параметризовать блоки скриптов:
$foo = {param($bar) write-host $bar}
Start-Job -ScriptBlock $foo -ArgumentList "HEY" | wait-job | receive-job
Функция должна находиться внутри скриптового блока:
Start-Job -ScriptBlock { function FOO { write-host "HEY" } ; FOO } | Wait-Job | Receive-Job