2017-06-16 51 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); 
    } 
} 

,并使用container.Resolve方法来创建MyTaskClass实例,但是它会发生由于PerRequestLifetimeManager,两个任务使用由DbContextFactory生成的相同dbcontext的错误,如果我想通过统一创建不同的dbcontext实例,所以我必须注册不同的IDbContextFactory的lifetimemanager?

感谢

+0

如果您的工厂总是返回相同的实例,那么它不是工厂 –

回答

0

,如果你根本就没有指定LifetimeManager,或使用TransientLifetimeManager,这是默认它的工作。每个解决方案将返回一个新的实例。在开始任务之前,您可以使用该方法和方法工厂的组合(在MyTaskClass类中注入了A Func<LogService>),因此每个任务都有不同的DbContext