将 HttpClient 传递给 class 库
Pass HttpClient to class library
我有一个通过外部系统发送电子邮件的订单管理系统。通过 http 调用访问外部系统。订单管理主要有3个项目:a class library,web api2,和mvc app。在 class 库中,这就是与电子邮件系统交互的服务所在的位置。我已经使用 Autofac 连接了所有依赖项。我正在考虑在 Web api 项目中创建 httpclient,以便将其传递给 class 库。在 ASP.NET 核心中它是可能的,但我不确定如何在 .net 4.8 中做到这一点。
上下文场景如下:
用户将使用调用网络的 mvc 应用程序下订单 api。 Web api 只是为 class 库中的所有逻辑提供端点。当用户下订单时,他们应该会收到一封包含订单详细信息的电子邮件。 class 库调用外部系统发送电子邮件。 class 库有一个名为 IMessagingService 的接口,它有一个方法 SendEmailAsync。此服务 MessagingService 的实现需要一个 httpclient
IMessagingService:
public interface IMessagingService
{
Task SendEmailAsync(string email, string message);
}
消息服务:
public class MessagingService : IMessagingService
{
private readonly HttpClient _httpClient;
public MessagingService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task SendEmailAsync(string email, string message)
{
await _httpClient.PostAsJsonAsync(/*content*/);
}
}
网络 API Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
internal static HttpClient _httpClient;
protected void Application_Start()
{
//Removed other lines
Uri baseUri = new Uri("");
_httpClient = new HttpClient
{
BaseAddress = baseUri
};
_httpClient.DefaultRequestHeaders.ConnectionClose = false;
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
ServicePointManager.FindServicePoint(baseUri).ConnectionLeaseTimeout = 60 * 1000;
}
}
Autofac 配置:
builder.RegisterType<MessagingService>()
.WithParameter("httpClient", WebApiApplication._httpClient)
.As<IMessagingService>()
.InstancePerRequest();
是否可以通过 Autofac 将 Global.asax.cs 中创建的 httpclient 传递给 class 库?有什么建议吗?
N.B。现在我无法迁移到 ASP.NET 核心。
如果在 Autofac 中注册期间 _httpClient
为空,那么对我来说,注册似乎是在执行 Application_Start
之前进行的。 Application_Start
创建新引用,但 Autofac 存储旧引用(空)。你应该重新组织你的代码。
我有一个通过外部系统发送电子邮件的订单管理系统。通过 http 调用访问外部系统。订单管理主要有3个项目:a class library,web api2,和mvc app。在 class 库中,这就是与电子邮件系统交互的服务所在的位置。我已经使用 Autofac 连接了所有依赖项。我正在考虑在 Web api 项目中创建 httpclient,以便将其传递给 class 库。在 ASP.NET 核心中它是可能的,但我不确定如何在 .net 4.8 中做到这一点。
上下文场景如下: 用户将使用调用网络的 mvc 应用程序下订单 api。 Web api 只是为 class 库中的所有逻辑提供端点。当用户下订单时,他们应该会收到一封包含订单详细信息的电子邮件。 class 库调用外部系统发送电子邮件。 class 库有一个名为 IMessagingService 的接口,它有一个方法 SendEmailAsync。此服务 MessagingService 的实现需要一个 httpclient
IMessagingService:
public interface IMessagingService
{
Task SendEmailAsync(string email, string message);
}
消息服务:
public class MessagingService : IMessagingService
{
private readonly HttpClient _httpClient;
public MessagingService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task SendEmailAsync(string email, string message)
{
await _httpClient.PostAsJsonAsync(/*content*/);
}
}
网络 API Global.asax.cs:
public class WebApiApplication : System.Web.HttpApplication
{
internal static HttpClient _httpClient;
protected void Application_Start()
{
//Removed other lines
Uri baseUri = new Uri("");
_httpClient = new HttpClient
{
BaseAddress = baseUri
};
_httpClient.DefaultRequestHeaders.ConnectionClose = false;
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
ServicePointManager.FindServicePoint(baseUri).ConnectionLeaseTimeout = 60 * 1000;
}
}
Autofac 配置:
builder.RegisterType<MessagingService>()
.WithParameter("httpClient", WebApiApplication._httpClient)
.As<IMessagingService>()
.InstancePerRequest();
是否可以通过 Autofac 将 Global.asax.cs 中创建的 httpclient 传递给 class 库?有什么建议吗?
N.B。现在我无法迁移到 ASP.NET 核心。
如果在 Autofac 中注册期间 _httpClient
为空,那么对我来说,注册似乎是在执行 Application_Start
之前进行的。 Application_Start
创建新引用,但 Autofac 存储旧引用(空)。你应该重新组织你的代码。