2017-06-16 4 views
0

私は注入し、このようユニティを使用しています:UnityはPerRequestLifetimeManagerにバックグラウンドタスクを挿入しますか?

container.RegisterType<IDbContextFactory, DbContextFactory>(new PerRequestLifetimeManager()); 

container.RegisterType<IRepository<Log>, Repository<Log>>(); 
//....other repositories here... 

container.RegisterType<ILogService, LogService>(); 
//...other services here... 

と私はのようなタスククラスを持っている:

public class MyTaskClass 
{ 

    LogService logService; 

    public MyTaskClass(LogService logService) 
    { 
     this.logService = logService; 
    } 

    async void ExecuteTasks() 
    { 
     Task t1 = Task.Factory.StartNew(() => 
     { 
     logService.Write("Test"); 
     }); 

     Task t2 = Task.Factory.StartNew(() => 
     { 
      logService.Write("Test"); 
     }); 

    await Task.WhenAll(t1, t2); 
    } 
} 

とMyTaskClassインスタンスを作成するために、container.Resolveメソッドを使用しますが、それが発生します2つのタスクがPerRequestLifetimeManagerのためにDbContextFactoryによって生成された同じdbcontextを使用するというエラーが発生しました.dbcontextの異なるインスタンスを1つ作成したい場合、IDbContextFactoryの別のlifetimemanagerを登録する必要がありますか?

おかげ

+0

工場が常に同じインスタンスを返す場合、工場は工場ではありません –

答えて

0

あなたは、単にデフォルトである、LifetimeManagerを指定するか、またはTransientLifetimeManagerを使用しなかった場合、それは動作します。各解決は新しいインスタンスを返します。タスクを開始する前に、メソッドファクトリ(A Func<LogService>MyTaskClassクラスに注入されています)を使用してコンビネーションを使用するので、それぞれにDbContextがあります。

関連する問題