SingleInstance()在窗口应用程序中是否是线程安全的

时间:2019-01-28 10:23:43

标签: c# multithreading dependency-injection autofac

我有一个Windows应用程序,在这里我通过Autofac实现依赖注入。我有一个DBContext类,它与db交互以进行sql操作。我正在使用EntityFramework。我有一种情况,我需要根据来自不同表的一些主键分别从数据库中获取数据。然后,再次经过一些业务逻辑后,我需要更新db中的那些实体。但是,在这里要么更新所有获取的数据库实体,要么不更新。所以我遵循的是工作单元模式。但是,当使用相同的dbContext实例从存储库中获取db实体时,它将丢失dbContext中的其他实体。我正在使用AsImplementedInterfaces()(来自autofac)解析我的DbContext实例,该实例在我的方案中不起作用。我将其更改为SingleInstance()即可实现我的要求。我的疑问是,SingleInstanceInstance()对于Windows应用程序还是上述方案的工作是否安全?

builder.Register(c => new PortalDbContext(connectionString)).As<IPortalDbContext>().AsImplementedInterfaces();    

TO

builder.Register(c => new PortalDbContext(connectionString)).As<IPortalDbContext>().SingleInstance();    

我有三个存储库类和一个业务层(BL),BL逐一调用所有存储库类,以使用相同的DBContext实例获取数据。然后,最后它调用一个方法DBContext.SaveChanges(),该方法应将所有实体数据保存一次,否则如果任何一个失败,则不应更新任何数据。它与SingleInstance()范围一起使用。但是不确定SingleInstance是否是线程安全的。

1 个答案:

答案 0 :(得分:0)

根据autfac的 service 分辨率,线程安全documentation

  

所有容器操作均可在多个线程之间安全使用。

唯一要记住的是,解析上下文对象是单线程的,因此您需要避免将组件注册为:

builder.Register(c => new MyComponent(c)); //DON'T DO!

但作为:

builder.Register(c =>
{
  IContext threadSpecificContext = c.Resolve<IComponentContext>(); // access real context.
  return new MyComponent(threadSpecificContext);
}

(请参阅threadSpecificContext已解决,并且未使用“ c”上下文)

在您的情况下,您根本没有使用“ c”上下文,另请参见此answer