C# 带有COM对象的Asp.NET核心WEB API

C# 带有COM对象的Asp.NET核心WEB API,c#,multithreading,com,asp.net-core-webapi,C#,Multithreading,Com,Asp.net Core Webapi,我在如何处理对webApi的多个调用方面遇到了问题 我的webApi的控制器正在使用一个com对象,该对象需要连接到数据库,并且一次只允许一个连接 假设我有两个控制器: -客户 -发票 如果同时调用“客户机”和“发票”,则第一个操作将失败 是否可以让多个控制器等待任务结束? 或者还有其他解决方案吗?创建一个简单的存储库模式来解决您的问题。存储库是一种特殊的Facade,它隐藏了数据库访问和返回域模型的实现细节 例如: public class DataObjectRepository: IDat

我在如何处理对webApi的多个调用方面遇到了问题

我的webApi的控制器正在使用一个com对象,该对象需要连接到数据库,并且一次只允许一个连接

假设我有两个控制器:

-客户

-发票

如果同时调用“客户机”和“发票”,则第一个操作将失败

是否可以让多个控制器等待任务结束?
或者还有其他解决方案吗?

创建一个简单的存储库模式来解决您的问题。存储库是一种特殊的
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>();
services.AddSingleton();

用任何域模型名替换
DataObject

创建一个简单的存储库模式来解决您的问题。存储库是一种特殊的
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>();
services.AddSingleton();

用任何域模型名替换
DataObject

最简单的解决方法:在com对象前面放一个“代理”类,让它锁定
以防止并发。我会投资IoC并注入一个“域”,或者像@franzgleichman所说的那样,插入一个处理锁定的代理类。确保通过singleton作用域中的IoC容器实例化域对象。最简单的修复方法是:在com对象前面放置一个“代理”类,让它锁定某个对象,以防止并发。我会投资IoC并注入一个“域”,或者像@Franzgleichman所说的那样,插入一个处理锁定的代理类。确保通过singleton作用域中的IoC容器实例化域对象。好的,我创建了3个存储库-ComRepository-ClientRepository-InvoiceRepository Client和Invoice Repo正在使用在ComRepository中创建的实例。它成功了。很高兴听到它成功了。别忘了投票/接受有用的答案。好的,我创建了3个存储库-ComRepository-ClientRepository-InvoiceRepository Client和Invoice Repo正在使用在ComRepository中创建的实例。它成功了。很高兴听到它成功了。别忘了投票/接受有用的答案。