Gemischter lifestyle für Pro Thread und Pro Web-Anfrage mit Einfach Injektor

Ich bin mit SimpleInjector als mein IoC-Bibliothek. Ich melde mich DbContext als pro web-Anfrage, und es funktioniert gut. Aber es ist eine Aufgabe, die ich ausführen es in einem hintergrund-thread. Also, ich habe ein problem zu schaffen DbContext Instanzen. z.B.

  1. Service1 hat eine Instanz von DbContext
  2. Service2 hat eine Instanz von DbContext
  3. Service1 und Service2 ausführen von hintergrund-thread.
  4. Service1 holt ein Unternehmen und übergeben es an Service2
  5. Service2 verwendet, die Einheit, aber Einheit ist losgelöst von DbContext

Eigentlich das problem ist hier: Service1.DbContext ist der Unterschied von Service2.DbContext.

Scheint es, wenn ich ausführen einer Aufgabe in einem separaten thread in ASP.NET MVC SimpleInjector erstellt eine neue Instanz von DbContext für jeden Anruf. Während einige IoC-Bibliotheken (zum Beispiel StructureMap) haben eine gemischte Lebensweise für die pro-thread-pro-webrequest, es scheint SimpleInjector noch nicht ein. Bin ich im Recht?

Haben Sie irgendeine Idee, um dieses problem zu lösen in SimpleInjector?
Vielen Dank im Voraus.

EDIT:

Meine Dienstleistungen sind hier:

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"
}

Ich Benutzer Service2 manchmal und AsyncService2 anderen Zeiten.

InformationsquelleAutor javad amiry | 2012-10-30
Schreibe einen Kommentar