Unity PerRequestLifetimeManager Wiederverwendung von Objekten in verschiedenen Anforderungen

Ich habe Unity für die Abhängigkeitsinjektion für unser Projekt eingerichtet. Das Projekt selbst ist eine ASP.NET-Anwendung, die sowohl MVC als auch die Web-API verwendet.

Für den Datenbankkontext verwende ich dasPerRequestLifetimeManager. Dies geschieht, damit die verschiedenen Bits der Geschäftslogik denselben Kontext (und damit dieselbe Transaktion) verwenden.

Um das @ benutzen zu könnPerRequestLifetimeManager, Ich habe Verweise auf die Nuget-Pakete hinzugefügtUnity-Bootstrapper für ASP.NET MVC undUnity-Bootstrapper für ASP.NET-Web-API.

Für die Verwendung dieses lebenslangen Managers in der Web-API wurde die folgende Zeile zum Startcode hinzugefügt:

Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));

Der Unity-Container ist sowohl für MVC als auch für die Web-API eingerichtet:

var container = BuildUnityContainer();
GlobalConfiguration.Configuration.DependencyResolver = new Microsoft.Practices.Unity.WebApi.UnityDependencyResolver(container);
System.Web.Mvc.DependencyResolver.SetResolver(new Microsoft.Practices.Unity.Mvc.UnityDependencyResolver(container));

Beim Erstellen des Unity-Containers wird der Datenbankkontext so eingerichtet, dass er auf folgende Weise pro Anforderung aufgelöst wird:

container.RegisterType<IDataContext>(new PerRequestLifetimeManager(),
    new InjectionFactory(c =>
    {
        // Some code
        return new DataContext(/* params */);
    }
));

Es scheint jedoch, dass dieser Code mir kein neues @ gibDataContext für jede Anfrage. Es gibt mir den gleichen Kontext an verschiedenen Stellen innerhalb einer einzigen Anfrage (was in Ordnung ist). Nachfolgenden (Web-API-) Anforderungen wird jedoch dieselbe Instanz von @ zugewieseDataContext wo würde ich erwarten, dass ein neues für jede neue Anfrage erstellt wird. Ich würde auch das @ erwartDataContext muss nach Abschluss der Anforderung ordnungsgemäß entsorgt werden (die Klasse implementiertIDisposable).

Was ist denn hier los? Fehlt mir ein bisschen Konfiguration, damit dies richtig funktioniert? Oder soll das nicht so funktionieren, wie ich es erwartet habe?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage