IOC DImultithreading生命周期范围在后台任务中

我有一个使用IOC和DI来创建和注入服务的应用程序。

我有一个处理一些业务逻辑的服务层,在服务层我有一个与数据库通信的存储库。 该存储库使用的是非线程安全的DataContext。

我想使用后台任务异步运行服务上的一些函数,但是知道这会导致存储库出现问题。 因此,我希望为每个创建的后台线程创建存储库。 这是如何实现的? 我正在使用StructureMap作为IoC。

public class Service : IService { IRepository _repository; public Service(IRepository repository) { this._repository = repository; } public void DoSomething() { // Do Work _repository.Save(); } } public class Controller { IService _service; public Controller(IService service) { this._service = service; } public Action DoSomethingManyTimes() { for(int i =0; i  { _service.DoSomething(); }); } } } 

一些DI容器(例如(IIIRC)StructureMap)实际上支持Per Thread生存期样式,但这可能不会帮助你,因为它会在一个线程上将IService注入Controller ,然后在许多其他线程上使用它。

我建议将Controller实现保留原样,因为IService的特定实现不是线程安全的,这是一个实现细节。

相反,创建一个IService的线程安全的Adapter / Decorator并将其注入Controller 。 像这样的东西:

 public ThreadSafeService : IService { private readonly IServiceFactory factory; public ThreadSafeService(IServiceFactory factory) { this.factory = factory; } public void DoSomething() { this.factory.Create().DoSomething(); } } 

IServiceFactory可以像这样声明:

 public interface IServiceFactory { IService Create(); } 

如果您实现IServiceFactory以便为每次调用Create创建一个新的IService实例,那么您手头就有一个线程安全的实现,因为没有共享状态。

这种方法与容器无关 ,可以防止漏洞抽象。