2017-09-26 5 views
0

エンティティフレームワークコアでasp.netコアとsqlserverを使用すると、私たちは残りのファイアウォールのエンドポイントを持っています。起動中services.AddDbContext非同期メソッドが使用される前に非同期メソッドで使用されるオブジェクトを破棄します

、我々はフレームワーク

services.AddDbContext<DBContext>(options=>options.UseSqlServer(/*connection string*/)); 

でDBContextを登録し、当社のコントローラメソッドは

[HttpPost(/*route*/)] 
public ObjectResult doWork([FromBody] string[] args) 
{ 
    IInjectedLogic.doWorkAsync(args); 
    return new OkObjectResult(""); 
} 

のようなもので、私たちのロジッククラスは、問題があることである

public interface IInjectedLogic 
{ 
    Task doWorkAsync(string[] args); 
} 

public class InjectedLogic:IInjectedLogic 
{ 
    private DBContext ctx; 
    private ILegacyWCFService wcfClient; 
    private ILogger logger; 

    public InjectedLogic(DBContext ctx,ILegacyWCFService wcfClient,ILogger logger) 
    { 
     this.ctx=ctx; 
     this.wcfClient=wcfClient; 
     this.logger=logger; 
    } 

    public async Task doWorkAsync(string[] args) 
    { 
     using(var transaction=ctx.Database.BeginTransaction()) 
     { 
      try 
      { 
       string[] processed=await wcfClient.doOtherWorkAsync(args); 
      } 
      catch(Exception ex) 
      { 
       transaction.RollBack(); 
       logger.logError(ex); 
      } 
      transaction.Commit(); 
     } 
    } 
} 

のようなものですctx.Databaseは、begin transactionが呼び出されると常に破棄されます。私の勘違いは、コントローラが一旦終了するとフレームワークがdisposeを呼び出すことであり、返されたものは範囲外になるということです。

誰かが私の疑惑を確認したり、実際に何が起こっているのかを教えてもらえますか。

+1

あなたがする必要がある*は、すなわち 'injectedLogic.doWorkAsync(引数)を待って、それらが終了するのを待つために*非同期メソッドを待つ;' – poke

+0

ポイントは、私ははしたくないですが完了するのを待ってからok応答を送信します。 –

答えて

0

DIコンテナから新しいスコープを作成することができます。依存関係の新しいインスタンスが解決され、完了すると削除されます。

例:

... 
using Microsoft.Extensions.DependencyInjection; 
... 

[HttpPost(/*route*/)] 
public IActionResult DoWork([FromBody] string[] args) 
{ 
    using (var scope = Request.HttpContext.RequestServices.CreateScope()) 
    { 
     var worker = scope.ServiceProvider.GetService<IInjectedLogic>(); 
     worker.doWorkAsync(args); 
    } 

    return NoContent(); 
} 
関連する問題