在 Net Core 上的自定义 class 模型中处理 HTTP 连接的更好方法是什么?

What is the better way to handle HTTP connections in a custom class model on Net Core?

我有一个使用 GRASP 模式设计的 class 模型,特别是控制器模式,所以 ProductController 处理所有 Product 个实例,而这个处理所有 Kardex 个实例.

ProductController 可以保存、编辑和删除产品。
Product 可以保存和删除卡迪斯机芯。

我只能使用 OOP 来处理这个问题,但我需要一些方法调用 API 来保存 and/or 从数据库中获取数据。

我的应用程序将不断地使用此 API 进行操作,因此我决定将 IHttpClientFactory 与 DI 一起使用。

如果我用它们各自的接口注入控制器不是问题,但如果产品实例必须 SaveKardex,我将不得不注入它以使用 HttpClientFactory,防止实例化。所以我这样做了:

public class Product
{
  private readonly IHttpClientFactory _httpClientFactory;
  public int prop1 { get; set; }
  
  public Product(IHttpClientFactory httpClientFactory) //this works
  {
     _httpClientFactory = httpClientFactory;
  }
  
  public Product() //this also works
  {
     prop1 = 10;
  }

  public async Task<bool> SaveKardex(Kardex kardex)
  {
     var client = _httpClientFactory.CreateClient("BdClient");
     var uriString = client.BaseAddress + $"product/kardex";
     var message = RequestBuilder.RequestMessage(HttpMethod.Post, uriString);
     var res = await client.SendAsync(message);
     ....
     ....
     return true;
  }
}

如果我实例化一个新的 Product 或被反序列化,我无法调用 SaveKardex 方法,因为我不会使用注入的实例并且 httpClientFactory 将为空。

我能做什么?有什么建议吗?

我想使用 HttpClient 实例,但考虑到与 API 的大量连接,这是最好的方法吗?

谢谢!

我解决了这个重新设计我的模型的问题,如下所示:(正如@Nkosi 所说,这是因为紧耦合和低内聚而受到影响)。

创建了一个 EntityLayer,其中包含将发送到 BD 的所有属性,反之亦然。

创建了一个接口,其中声明了 BD 操作。

已创建“服务 class”来实现接口。此 class 在 .net 核心上被感染,而不是在其他核心上感染。

最后,Product 的所有实例都收到此接口(由 ProductService 实现),这样我就可以调用“bd 操作”。

public class EntityProduct
{
  public int prop1 {get; set; }
}

public interface IProductOperations
{
  Task<bool> SaveKardex(int prop);
}

public class ProductService : IProductOperations //only this class is inyected
{
  private IHttpClientFactory httpClientFactory;
  public ProductService(IHttpClientFactory httpClientFactory)
  {
     this.httpClientFactory = httpClientFactory;
  }

  public async Task<bool> SaveKardex(int prop)
  {
     var client = _httpClientFactory.CreateClient("BdClient");
     var uriString = client.BaseAddress + $"product/kardex/{prop}";
     var message = RequestBuilder.RequestMessage(HttpMethod.Post, uriString);
     var res = await client.SendAsync(message);
     ....
     ....
     return true;
  }
}

public class Product
{
  private IProductOperations _productOperations;
  public EntityProduct Entity { get; set; }
  
  public Product(IProductOperations productOperations)
  {
     _productOperations = productOperations;
  }
  
  public async Task<bool> SaveKardex(int prop)
  {
     var result = await _productOperations.SaveKardex(prop);
     ....
     ....
     return true;
  }
}

感谢@robert-paulen

,我可以做到这一点