Action<ServiceBusConfigurator>
- это метод, который принимает один параметр типа ServiceBusConfigurator
, выполняет «действие», работающее с этим экземпляром, и ничего не возвращает (void
).
.NET BCL (начиная с 3.5) поставляется с предопределенными общими сигнатурами делегатов: Action<T>
, Action<T1, T2>
(и т. д.) для методов, которые не возвращают значение, и Func<Tresult>
, Func<T, Tresult>
(и т. д.) для методов, принимающих ноль от болеепараметров и возвращая один экземпляр результата типа Tresult
.
Когда вы создаете метод, который принимает делегат, вы позволяете вызывающим объектам вашего метода передавать больше, чем просто параметры данных - ваш метод фактически делегирует частьответственность за внешний код.В вашем случае Bus.Initialize
создает экземпляр ServiceBusConfigurator
(sbc
), а затем вызывает указанное действие с экземпляром sbc
в качестве параметра.
Это в основном позволяет вашему методу управлять временем жизниэкземпляра класса конфигурации.Вызывающий должен заполнить детали, но фактический экземпляр предоставляется вашим классом:
// this is not actual mass transit source code
public class BusCreator
{
public static IBus Initialize(Action<IConfiguration> action)
{
// create the config instance here
IConfiguration config = CreateDefaultConfig();
// let callers modify it
action(config);
// use the final version to build the result
return config.Build()
}
}
Преимущество заключается в том, что ваш построенный экземпляр (в данном случае мнимый IBus
) не может быть измененв дальнейшем.Экземпляр конфигурации создается только в ближайшее время, передается внешнему методу и затем используется для создания неизменяемого конечного объекта:
IBus result = BusCreator.Configure(cfg => cfg.BusType = BusType.MSMQ);
В строке выше следует отметить две вещи:
Код внутри анонимного метода обернут внутри делегата, переданного методу.Он не выполняется до тех пор, пока метод Configure
не вызовет его.
Параметр cfg
создается методом Configure
и передается в лямбду.После возврата метода этот объект больше не существует (или обернут в результирующий объект).