在 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
的,我可以做到这一点
我有一个使用 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
的