IOC后台任务中的DI多线程生命周期范围我有一个使用IOC和DI来创建和注入服务的应用程序。我有一个处理一些业务逻辑的服务层,在服务层中我有一个与数据库通信的存储库。存储库使用的是非线程安全的DataContext。我想使用后台任务在服务上异步运行一些功能,但我知道这会导致存储库出现问题。因此,我希望为每个创建的后台线程创建一个存储库。这怎么可能?我正在使用StructureMap作为IoC。公共类服务:IService{IRepository_repository;公共服务(IRepository存储库){this._repository=repository;}publicvoidDoSomething(){//做工作_repository.Save();}}公共类控制器{IService_service;公共控制器(IService服务){this._service=service;}publicActionDoSomethingManyTimes(){for(inti=0;i{_service.DoSomething();});一些DI容器(例如(IIIRC)StructureMap)实际上支持每线程生命周期样式,但这可能对您没有帮助,因为它会在一个线程上将IService注入控制器,然后在许多其他线程上使用它.我建议保持Controller实现不变,因为IService的具体实现不是线程安全的,它是一个实现细节。相反,创建IService的线程安全适配器/装饰器并将其注入控制器。像这样:publicThreadSafeService:IService{privatereadonlyIServiceFactoryfactory;publicThreadSafeService(IServiceFactoryfactory){this.factory=factory;}publicvoidDoSomething(){this.factory.Create().DoSomething();}}IServiceFactory可以这样声明:publicinterfaceIServiceFactory{IServiceCreate();如果您实现IServiceFactory以便为每次调用Create创建一个新的IService实例,那么您手头就有一个线程安全的实现,因为没有共享状态。这种方法与容器无关,可以防止泄漏抽象。以上就是C#学习教程的全部内容:后台任务共享的IOCDI多线程生命周期作用域。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
