#c# #multithreading #com #asp.net-core-webapi
#c# #многопоточность #com #asp.net-core-webapi
Вопрос:
У меня возникли проблемы с обработкой нескольких вызовов моего WebAPI.
Контроллеры моего WebAPI используют com-объект, который должен подключаться к базе данных и разрешать только одно соединение за раз.
Допустим, у меня есть 2 контроллера :
-Клиенты
-Счета-фактуры
Если «Клиенты» и «Счета» вызываются одновременно, первая операция завершится неудачей.
Возможно ли заставить несколько контроллеров ждать окончания задачи? Или есть какие-либо другие решения?
Комментарии:
1. самое простое возможное исправление: поместите класс «прокси» перед вашим com-объектом и включите его в что
lock
-нибудь, чтобы предотвратить параллелизм.2. Я бы инвестировал в IoC и внедрил «Домен» или, как говорит @FranzGleichmann, прокси-класс, который обрабатывает блокировку. Убедитесь, что вы создаете экземпляр объекта домена через контейнер IoC в одноэлементной области.
Ответ №1:
Создайте простой шаблон репозитория для решения вашей проблемы. Репозитории — это особый вид Facade
, который скрывает детали реализации вашего доступа к базе данных и возвращает модели домена
Пример:
public class DataObjectRepository: IDataObjectRepository {
private static readonly object x = new object();
public DataObject GetObject() {
lock (x)
{
// Your code accessing the COM object
}
}
}
Затем введите его как одноэлементный
services.AddSingleton<IDataObjectRepository, DataObjectRepository>();
Замените DataObject
на любое имя модели домена.
Комментарии:
1. Итак, я создал 3 репозитория — ComRepository — ClientRepository — InvoiceRepository Клиент и репозиторий счетов-фактур используют экземпляр, созданный в ComRepository. И это сработало.
2. Рад слышать, что это сработало. Не забудьте проголосовать / принять полезные ответы.