将继承的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事务。
答案 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();
。