L'unité PerRequestLifetimeManager de ré-utilisation de l'objet dans différentes demandes
J'ai mis en place une Unité d'injection de dépendance pour notre projet. Le projet lui-même est un ASP.NET application qui utilise à la fois MVC et Web API.
Pour le contexte de base de données, je suis en utilisant le PerRequestLifetimeManager
. Ceci est fait de sorte que les différents morceaux de la logique d'entreprise utilisent le même contexte (et donc la même opération).
Afin d'être en mesure d'utiliser le PerRequestLifetimeManager
, j'ai ajouté des références pour les packages nuget l'Unité de programme d'amorçage pour ASP.NET MVC et l'Unité de programme d'amorçage pour ASP.NET l'API Web.
Pour l'utilisation de cette vie de manager dans l'API Web, la ligne suivante a été ajoutée au code de démarrage:
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
L'Unité de conteneur est mis en place pour les deux MVC et Web API:
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));
Dans la construction de l'Unité de conteneur, le contexte de base de données est configuré pour être résolu par la demande de la manière suivante:
container.RegisterType<IDataContext>(new PerRequestLifetimeManager(),
new InjectionFactory(c =>
{
//Some code
return new DataContext(/* params */);
}
));
Cependant, il semble que ce code n'est pas de me donner une nouvelle DataContext
pour chaque demande. Il me donne le même contexte, dans des endroits différents à l'intérieur d'une seule requête (qui est très bien). Cependant, à la suite (api web) demandes ont la même instance de DataContext
où je m'attends à un nouveau à être créé pour chaque nouvelle demande. Je voudrais également s'attendre à la DataContext
à être éliminés après la demande n'est pas terminée (la classe implémente IDisposable
).
Ce qui se passe ici? Je manque un peu de configuration à faire ce travail correctement? Ou n'est-ce pas censé travailler à la manière dont je m'attendre?
OriginalL'auteur René Wolferink | 2014-11-21
Vous devez vous connecter pour publier un commentaire.
Le problème s'est avéré être que le
UnityDependencyResolver
a été mise en cache des éléments résolus au cours de plusieurs demandes. J'ai dû changer à laUnityHierarchicalDependencyResolver
et puis il a commencé à la résolution de mes articles correctement selon l'associatedLifetimeManager
. Le problème au départ est devenue plus confuse, quand il est apparu que, même lors de l'utilisation d'unTransientLifetimeManager
, il serait toujours revenir à la même instance.J'ai trouvé la réponse dans un autre (encore un peu en rapport) question: à l'aide d'un Gestionnaire dans l'API Web et d'avoir l'Unité résoudre par demande
Donc j'ai tout changement
à
et tous mes problèmes ont été résolus.
OriginalL'auteur René Wolferink