gpt4 book ai didi

c# - Asp.Net Core - 需要从没有依赖注入(inject)的情况下生成的实例访问 HttpContext 实例

转载 作者:行者123 更新时间:2023-11-30 21:50:53 25 4
gpt4 key购买 nike

我正在使用 Asp.Net Core RC1,我必须从模型生成器生成的实例(来自 CaSTLe.Core 的拦截器)访问 HttpContext 实例>,准确地说)。模型生成器必须是贯穿整个应用程序的单个实例。

我需要在启动文件中创建一个 ModelGenerator 实例,因为它用于配置一些序列化程序所需的静态 lambda。序列化程序是静态注册的,所以我必须写入启动:

var modelGenerator = new ModelGenerator();
Serializers.Configure(modelGenerator); // static use of model generator instance

我还将 modelGenerator 添加为单例实例,用于 DI 的其他用途。

services.AddInstance<IModelGenerator>(modelGenerator);

如果使用 DI,我会做的是从 ModelGenerator 的构造函数中获取一个 IHttpContextAccessor 接口(interface),但是我不能进入这个上下文,因为我在启动时没有实例。我需要类似 ServiceLocator 的东西来从 ModelGenerator 调用,或者我忽略的其他一些模式。

如何从 ModelGenerator 生成的拦截器到达更新的 HttpContext 实例,其中包含当前请求的信息?

最佳答案

似乎无法在应用程序启动时获取 HttpContext 的实例。这是有道理的 - 在以前版本的 MVC 中,这在 IIS 集成模式或 OWIN 中是不可能的。

所以你有两个问题:

  • 如何将 IHttpContextAccessor 放入序列化程序中?
  • 如何确保 HttpContext 在可用之前不被访问?

第一个问题非常简单。您只需要在 IHttpContextAccessor 上使用构造函数注入(inject)。

public interface ISerializer
{
void Test();
}

public class ModelGenerator : ISerializer
{
private readonly IHttpContextAccessor httpContextAccessor;

public ModelGenerator(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}

public void Test()
{
var context = this.httpContextAccessor.HttpContext;

// Use the context
}
}

然后注册...

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Other code...

// Add the model generator
services.AddTransient<ISerializer, ModelGenerator>();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var serializers = app.ApplicationServices.GetServices<ISerializer>();
foreach (var serializer in serializers)
{
Serializers.Configure(serializer);
}

// Other code...
}

第二个问题可以通过将您需要的任何初始化调用 HttpContext 移到全局过滤器中来解决。

public class SerializerFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext context)
{
// TODO: Put some kind of if condition (possibly a
// global static variable) here to ensure this
// only runs when needed.
Serializers.Test();
}
}

并在全局注册过滤器:

public void ConfigureServices(IServiceCollection services)
{
// Other code...

// Add the global filter for the serializer
services.AddMvc(options =>
{
options.Filters.Add(new SerializerFilter());
});

// Other code...
}

如果您的 Serializers.Configure() 方法需要 HttpContext 才能工作,那么您需要将该调用移至全局过滤器中。

关于c# - Asp.Net Core - 需要从没有依赖注入(inject)的情况下生成的实例访问 HttpContext 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36049769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com