在ASP.NET核心中,如何将HttpContext注入扩展方法?

时间:2017-05-10 01:18:51

标签: c# asp.net-core

将继承的ASP.NET应用程序移植到使用SqlCommand扩展方法实现伪环境事务的ASP.NET核心:

public static class SqlExtension
{
    public static SqlCommand NewCommand( this SqlConnection c )
    {
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = c;

        SqlTransaction ambientTransaction = (SqlTransaction)
            HttpContext.Current.Items["AmbientTransaction"];

        if (ambientTransaction != null)
        {
            cmd.Transaction = ambientTransaction;
        }
        return cmd;
    }

使用环境事务的Sql语句遍布数百个地方的代码。由于HttpContext不再可全局访问,我很感激建议:

1)关于如何让事情暂时运作。是否可以将HttpContext注入扩展方法?

2)重新实现代码时要遵循的模式,以实现相同的目标,即围绕单个http请求中完成的所有工作包装SQL事务。

3 个答案:

答案 0 :(得分:1)

您有两种选择:

1.直接解决方法中的依赖关系,但我不推荐它。虽然你也需要IApplicationBuilder

var httpContext =  (IHttpContextAccessor)app.ApplicationServices.GetService(typeof(IHttpContextAccessor))

2.通过方法

中的参数
public static SqlCommand NewCommand( this SqlConnection c, IHttpContextAccesor http )
{
}

答案 1 :(得分:0)

注入对调用者的依赖,只需在扩展方法中传递HttpContext的参数。

答案 2 :(得分:0)

I found elegant solution in this article。首先,创建静态类AppContext,然后在Configure方法的Startup.cs中对其进行配置。不要忘记在ConfigureServices方法中添加services.AddHttpContextAccessor();