2017-06-16 3 views
0

Ich bin mit Unity injizieren und wie folgt aus:Unity injizieren PerRequestLifetimeManager mit Hintergrundaufgaben?

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

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

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

Und ich habe eine Aufgabe Klasse wie:

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); 
    } 
} 

und verwenden container.Resolve Methode eine MyTaskClass Instanz zu erstellen, aber es wird kommen Fehler, dass zwei Tasks denselben dbcontext verwenden, der von DbContextFactory erzeugt wurde, wegen des PerRequestLifetimeManagers, wenn ich eine andere Instanz von dbcontext by unity erstellen möchte, also muss ich einen anderen lifetimemanager von IDbContextFactory registrieren?

Dank

+0

Wenn Ihre Fabrik immer dieselbe Instanz zurückgibt, handelt es sich nicht um eine Fabrik –

Antwort

0

Es würde funktionieren, wenn Sie nicht ein LifetimeManager, oder verwenden Sie das TransientLifetimeManager, die Standardeinstellung angegeben haben. Jede Auflösung gibt eine neue Instanz zurück. Sie verwenden das, mit und einer Kombination einer Methodenfabrik (A Func<LogService> injiziert in Ihrer MyTaskClass Klasse), bevor Sie die Aufgaben starten, so dass jeder von ihnen eine andere DbContext haben wird.

Verwandte Themen