c# - 是否可以为整个执行路径提供特定于请求的类?
问题描述
考虑以下 ASP.NET Core 项目/类结构:
Request comes in
Middleware
Controller [calls]
BusinessLayer
BusinessRules
HelperClasses
DomainSpecificClass
etc..
当请求进来时,我想在中间件组件中设置一些值,并让它们在 DomainSpecificClass 中可用 - 对于该特定请求。我想,我可以通过依赖注入和方法参数的组合来探测这些值,但我想知道是否有更简单的方法。
就像是:
// middleware class
public async Task Invoke(HttpContext context) {
// RequestContext is a made up class
RequestContext.Referrer = context.Request.Headers["Referer"].ToString();
}
// DomainSpecificClass
private void DoStuff() {
string referrer = RequestContext.Referrer;
}
这种类型的实现在 .NET Core 中是否可行?
解决方案
您可以创建一个从“当前”请求中提供所需数据的类,并将其在 DI 中注册为“Scoped”——每个请求一个实例。
public interface ICurrentRequest
{
string Referrer();
}
public class CurrentRequest : ICurrentRequest
{
private readonly IHttpContextAccessor _contextAccessor;
public CurrentRequest(IHttpContextAccessor contextAccessor)
{
_contextAccessor = contextAccessor;
}
public string Referrer()
{
return _contextAccessor.HttpContext.Request.Headers["Referer"].ToString();
}
}
使用 ASP.NET 内置 DI 容器将实现注册为“Scoped”
services.AddHttpContextAccessor(); // Built-in extension method
services.AddScoped<ICurrentRequest, CurrentRequest>();
在业务层消费
public class DomainSpecificClass
{
private readonly ICurrentRequest _currentRequest;
public DomainSpecificClass(ICurrentRequest currentRequest)
{
_currentRequest = currentRequest;
}
private void DoStuff()
{
var referrer = _currentRequest.Referrer();
}
}
ICurrentRequest
抽象可以在业务层中声明,因此应用程序的任何主机都可以实现它,并且业务逻辑将不依赖于“Http”抽象。
推荐阅读
- php - 子文件夹中的附加 .htaccess | 查询参数的 mod_rewrite
- php - 有没有办法在 Amazon S3 上压缩目录并在应用程序中动态下载它
- svelte - 在 Svelte 中禁用环绕链接
- linux - 如何在不同服务器上的另一个 shell 脚本中运行 shell 脚本?
- python - 在 docker 容器中安装 yfinance python 包
- tomcat - 使用 openssl 为 tomcat 生成 ssl 证书会创建 firefox 不喜欢的“DSA”
- rust - 折叠字符串以在 rust 中构建 hashmap 字符计数器,但给出两阶段借用错误
- javascript - 如何通过在 JS 中对消息进行分组来推送到子数组?
- puppet - 服务是否可以通知 Puppet 中的另一个资源?
- apache-kafka - 如何使用运行多个实例的 Kafka Streams 进行主题级排序/计数