Я использую SimpleInjector
в качестве моей библиотеки IoC. Я регистрирую DbContext
в соответствии с веб-запросом, и он отлично работает. Но есть одна задача, которую я запускаю в фоновом потоке. Таким образом, у меня возникла проблема с созданием экземпляров DbContext
. например.
-
Service1
имеет экземплярDbContext
-
Service2
имеет экземплярDbContext
-
Service1
иService2
выполняется из фонового потока. -
Service1
извлекает объект и передает егоService2
-
Service2
использует этот объект, но объект отделяется отDbContext
На самом деле проблема здесь: Service1.DbContext
является отличием от Service2.DbContext
.
Кажется, когда я запускаю задачу в отдельном потоке в ASP.NET MVC, SimpleInjector
создает новый экземпляр DbContext
для каждого вызова. Хотя некоторые библиотеки IoC (например, StructureMap
) имеют смешанный образ жизни для per-thread-per-webrequest, кажется, что SimpleInjector
не имеет одного. Я прав?
Есть ли у вас идея решить эту проблему в SimpleInjector
?
Спасибо заранее.
EDIT:
Мои услуги здесь:
class Service1 : IService1 {
public Service1(MyDbContext context) { }
}
class Service2 : IService2 {
public Service2(MyDbContext context, IService1 service1) { }
}
class SyncServiceUsage {
public SyncServiceUsage(Service2 service2) {
// use Service2 (and Service1 and DbContext) from HttpContext.Current
}
}
class AsyncServiceUsage {
public AsyncServiceUsage(Service2 service2) {
// use Service2 (and Service1 and DbContext) from background thread
}
}
public class AsyncCommandHandlerDecorator<TCommand>
: ICommandHandler<TCommand> where TCommand : ICommand {
private readonly Func<ICommandHandler<TCommand>> _factory;
public AsyncCommandHandlerDecorator(Func<ICommandHandler<TCommand>> factory) {
_factory = factory;
}
public void Handle(TCommand command) {
ThreadPool.QueueUserWorkItem(_ => {
// Create new handler in this thread.
var handler = _factory();
handler.Handle(command);
});
}
}
void InitializeSimpleInjector() {
register AsyncCommandHandlerDecorator for services (commands actually) that starts with "Async"
}
Я пользователь Service2
иногда и AsyncService2
другие времена.