2017-05-10 1 views
0

:アンビエントトランザクションを使用ASP.NETコアでは、どのように拡張メソッドにHttpContextを注入しますか?擬似周囲トランザクション実装するSqlCommandオブジェクトの拡張メソッドを使用するASP.NETコアに継承された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トランザクションをラップする、コードが再実装されるときのパターン。

+1

だけでなく必要があなたは、メソッドの引数として 'HttpContext'を追加することができます。 – Amy

+0

良い提案。 'public static SqlCommand NewCommand(このSqlConnection c、HttpContext h)の行に沿って何かを行い、元のものから新しい拡張メソッドを呼び出すことを望んでいました。 – Mark

+0

httpコンテキストを使用せず、代わりに – davidfowl

答えて

1

は、次の2つのオプションがあります。

1.Resolve直接法で依存関係を、私はそれをお勧めしません。あなたがメソッドのパラメータ2.Pass IApplicationBuilder

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

public static SqlCommand NewCommand(this SqlConnection c, IHttpContextAccesor http) 
{ 
} 
+0

AsyncLocalを使用してください。拡張メソッドを使用せず、これを新しいクラスに持ち、DI経由でピックアップする 'IHttpContextAccessor' – Mardoxx

0

呼び出し元に依存関係を追加するには、拡張メソッドでHttpContextのパラメータを渡すだけです。

関連する問題