Asp.NET ОСНОВНОЙ ВЕБ-API с COM-ОБЪЕКТОМ

#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. Рад слышать, что это сработало. Не забудьте проголосовать / принять полезные ответы.