Управление подключением к общественному транспорту в библиотеке классов

Я пытаюсь использовать общественный транспорт для обработки ответов на запросы. Большинство примеров общественного транспорта относятся к консольному приложению или веб-приложению, и я не знаю, как запустить или остановить автобус производителя, когда я использую его в библиотеке классов.

Потому что в примерах для веб-приложений шина запускается при запуске приложения, а для библиотеки классов нет такой вещи, как startup.cs.

У меня вопрос: где начать автобус или остановиться, когда я использую библиотеку классов для подключения к автобусу?

Код моего производителя выглядит так

IBusControl busControl = CreateBus();
TaskUtil.Await(() => busControl.StartAsync());
IRequestClient<IAccountingRequest, IAccountingResponse> client = CreateRequestClient(busControl);
IAccountingResponse response = null;
AccountingRequest accountingRequest = MapToAccountingRequest(accountingIntegration);

Task.Run(async () =>
{
    response = await client.Request(accountingRequest);          
}).Wait();
busControl.Stop();

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


person Fikret Asma    schedule 21.05.2018    source источник
comment
Task.Run относится к процессору, а MT - к вводу-выводу.   -  person Alexey Zimarev    schedule 22.05.2018
comment
Я просто хотел дождаться ответа. Есть ли какое-то решение, чтобы подождать без Task.Run?   -  person Fikret Asma    schedule 23.05.2018
comment
Что ж, await явно ждет ответа.   -  person Alexey Zimarev    schedule 23.05.2018


Ответы (1)


Вы должны предоставить методы в своей библиотеке классов для запуска / остановки автобуса. Вы можете абстрагироваться от них, как хотите, но предоставить разработчику возможность запускать и выключать шину. Многие другие библиотеки для этого, обычно с помощью метода Stop, Shutdown, Close и т. Д.

Тот факт, что вы также скрываете Задачу в приведенном выше примере и блокируете / ожидаете, заставляет меня думать, что вы застряли в чем-то супер-унаследованном, чего вы не можете избежать. В этом случае, ну, я должен был сказать это, но управлять ссылкой на шину в некотором статическом синглтоне (фу) и запускать его при первом использовании (двойное фу), затем попробуйте найти ловушку при выходе из приложения чтобы остановить его чистым (удачи).

Лучшее решение - позвонить разработчикам в вашу библиотеку, чтобы они выключили ее, чтобы освободить соединение и ресурсы.

person Chris Patterson    schedule 21.05.2018
comment
Большое спасибо. Под библиотекой классов я имею в виду бизнес-уровень. Я использую массовый транспорт для замены устаревшей библиотеки DLL, и я использую для этого шаблон запроса / ответа. Поскольку я использую шину на бизнес-уровне, у меня нет контроля над запуском или остановкой шины в жизненном цикле приложения Итак, мой вопрос, можно ли начинать до client.Request и останавливаться после этого? Если запускать и останавливать шину для вызова клиента - не лучшая идея. Запрос на стороне производителя, могу ли я управлять запуском или остановкой шины на стороне инжектора зависимостей? - person Fikret Asma; 23.05.2018