Unity为后台任务注入PerRequestLifetimeManager?

时间:2017-06-16 11:47:37

标签: c# unity-container

我使用Unity注入并且像这样:

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会发生错误,如果我想通过unity创建不同的dbcontext实例,那么我必须注册不同的终身经理IDbContextFactory?

由于

1 个答案:

答案 0 :(得分:0)

如果你只是没有指定LifetimeManager,或者使用TransientLifetimeManager这是默认设置,那么它会起作用。每个解析都将返回一个新实例。在开始任务之前,您可以使用它,并使用方法工厂的组合(在Func<LogService>类中注入A MyTaskClass),因此每个任务都会有不同的DbContext。< / p>