Wie zu verwenden Autofac zu beheben Instanz pro Anfrage Abhängigkeiten für Arten, die in einem Kind Lebensdauer Gültigkeitsbereich erstellt von Nancy

Wir haben mehrere Anwendungen in Windows-Diensten gehostet, das selbst Gastgeber eine Nancy-Endpunkt, um hinterher die Instrumentierung über den Betrieb der Anwendungen.

Verwenden wir Autofac als unsere IOC. In mehreren Repositorys registriert sind, in das root-container in einem Kern-DLL, die gemeinsam von allen Anwendungen; dieser Behälter wird dann an Nancy, als Ihre container mit einem bootstrapper abgeleitet aus der Nancy.Autofac.Bootstrapper.

Was wir fanden, war, dass, wenn eine web-Anfrage empfangen wird, die durch Nancy es behebt eine Anfrage für ein repository aus dem root-container, und dies führte zu Speicher verbraucht, durch nicht-Müll gesammelt IDisposables als root-container nicht außerhalb des Bereichs (es hat die Lebensdauer von den windows-Dienst). Dies führte zu den Dienstleistungen, die "undichte" Speicher.

Wir dann umgestellt auf ein Modell, wo wir die zusätzlichen Anmeldungen für die repositories mit InstancePerRequest in der überschriebenen ConfigureRequestContainer() - Methode in unserer Nancy bootstrapper:

protected override void ConfigureRequestContainer(ILifetimeScope container, NancyContext context)
{
    base.ConfigureRequestContainer(container, context);
    PerRequestContainerBuilder().Update(container.ComponentRegistry);
}

private static ContainerBuilder PerRequestContainerBuilder()
{
    var builder = new ContainerBuilder();

    //Dependency for repository
    builder.RegisterType<SystemDateTimeProvider>().InstancePerRequest().As<IDateTimeProvider>();

    //Repository
    builder.RegisterType<BookmarkRepository>().InstancePerRequest().As<IBookmarkRepository>();

    return builder;
}

Wir überschreiben auch die CreateRequestContainer() - Methode zum erstellen der Anfrage-container mit dem tag MatchingScopeLifetimeTags.RequestLifetimeScopeTag.

protected override ILifetimeScope CreateRequestContainer(NancyContext context)
{
     return ApplicationContainer.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag);
}

Dieser scheint das problem gelöst zu IDisposables nicht entsorgt werden - das Kind Anfrage-container entsorgt wird, am Ende der web-Anfrage-pipeline und Objekte aufgelöst, es sind auch entsorgt werden und schließlich von der garbage Collection eingesammelt.

Unser problem ist, dass dies scheint zu lecken die details der Implementierung des repositories in die Dienste da wir nicht nur registrieren Sie das repository, in ConfigureRequestContainer() aber auch alle anderen benötigten Objekte durch das repository, d.h. wenn wir möchten, ändern Sie die Implementierung eines repository haben wir "walk the dependency chain" zu registrieren, die benötigten Objekte in den einzelnen service-mit es - dies scheint falsch.

Gibt es eine Möglichkeit, die wir bekommen können Autofac zu beheben unterstützende Objekte für die repositories aus dem root-container aber halten Sie die Registrierungsinformationen im Rahmen der web-Anfrage-container? Oder gibt es eine Möglichkeit, automatisch kopieren von bestehenden Eintragungen aus dem root-container in der Kind-container, wenn es erstellt wird?

  • Ich bin mir nicht sicher, was du meinst mit "wenn wir wollen, ändern Sie die Implementierung eines repository haben wir "walk the dependency chain" zu registrieren, die benötigten Objekte in den einzelnen service-Verwendung"? BTW, wie von Nancy 1.1, gibt es keine Notwendigkeit zum überschreiben CreateRequestContainer hinzufügen der request-Leben-tag. Es ist standardmäßig gemacht. Siehe github.com/NancyFx/Nancy.Bootstrappers.Autofac/pull/24
InformationsquelleAutor Hugh lacey | 2015-02-17
Schreibe einen Kommentar