Я использую 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 другие времена.