Comment faire pour supprimer(désinscription) enregistré exemple de l'Unité de la cartographie?
Je rencontre un problème que je ne peux pas résoudre maintenant.
J'ai le texte suivant:
UnityHelper.DefaultContainer.RegisterInstance(typeof(IMyInterface), "test", instance);
où UnityHelper.DefaultContainer
est mon aide pour l'obtention de l'unité de conteneur avec chargés de configuration.
ici, je me suis inscrit instance
comme une instance de IMyInterface
.
Donc, n'importe où( peu de temps après l'utilisation) je veux enlever cette cartographie. Supprimer tout. Comment je peux faire?
J'ai essayé:
UnityHelper.DefaultContainer.Teardown(instance)
mais a échoué et le code suivant renvoie instance
de toute façon:
UnityHelper.DefaultContainer.ResolveAll<IMyInterface>()
- Intéressant. Pourquoi voulez-vous en chemin?
- J'utilise moqué de cas de tests et de vouloir effacer de l'environnement pour le prochain test. Actuellement, les instances de test précédent dans le conteneur et apparaissent quand je l'appelle ResolveAll<IMyInterface>().
- Dans le voir scénario développeur peut modifier la mise en œuvre à la volée.
- Habituellement, je créer récipient séparé pour chaque test. Cela évite de tels problèmes... Concernant la modification à la volée - Ce qui va provoquer des problèmes avec concurency - être prudent. Je pense que la mise en œuvre peut être changen en enregistrant un autre exemple, avec le même nom (mais je ne sais plus).
- oui sur l'inscription, mais il ne sera pas supprimer à partir de "liste de tous", il est possible de créer un vide de la mise en œuvre d'émuler le supprimer, mais je n'aime pas de cette façon. Création d'un conteneur séparé est bonne, mais le conteneur est créé dans le code que je veux tester.
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème et vient de retirer les enregistrements de la
ContainerControlledLifetimeManager
de monContainer
:Je pense que c'est ce que vous cherchez.
Voici comment j'ai manipulé l'annulation de l'inscription des instances à partir d'une unité de conteneur
J'avais besoin pour mettre en œuvre Ajouter/Supprimer des fonctionnalités comme ceci:
J'ai créé un custom durée de vie directeur pour faire de la mise en œuvre
Ici est la mise en œuvre finale:
appel removevalue sur la durée de vie personnalisé gestionnaire des causes de l'instance pour être non
C'est une vieille question, mais certaines réponses sont trompeuses, donc je vais vous donner mon propre.
Tu ne peux pas faire cela avec l'Unité. Fin de l'histoire.
L'appel de
RemoveValue
sur les enregistrements de la durée de vie des gestionnaires ne permet pas d'obtenir l'annulation de l'inscription (plus d'informations sur la durée de vie des gestionnaires de), et que la méthode n'est pas prévu pour annuler quoi que ce soit. Donc au final comportement est inattendu et pas pratique. Bien sûr,RemoveValue
a encore moins de sens si vous vous inscrivez à une mise en œuvre ou d'une usine méthode, bien que la question est à propos de l'annulation de l'inscription des instances.Envisager le prochain morceau de code
Si vous le débogage, vous verrez qu'après l'appel à
ClearValue
, le conteneur toujours dit que c'est enregistré, mais si vous essayez de résoudre cette instance, il va lever une exception. Ce qui est encore pire, les appels àResolveAll<T>
échouera aussi.Pour résumer, peu importe si vous ne
ClearValue
, enrouler autour de votre registre de l'instance avec un autre Cio ou une classe personnalisée, ou de fournir votre propre LifeTimeManager,ResolveAll<T>
etIsRegistered<T>
l'habitude de se comporter comme prévu, et que l'enregistrement va être encore là. Donc, ne pas essayer, car il l'habitude de travailler et cela va causer des problèmes sur la route.J'ai le même problème et après avoir expérimenté, je l'ai résolu en utilisant la norme ContainerControlledLifetimeManager et de l'appel de RemoveValue quand je veux retirer le récipient de l'instance. Notez que si vous n'êtes pas en utilisant les interfaces et l'objet de votre constructeur qui a le conteneur pouvez trouver et utiliser, il va recréer l'instance après avoir détruit avec lifetimeManager.RemoveValue().
J'ai eu une demande similaire par lequel je voulais stocker temporairement des objets dans l'unité de conteneur et trouvé que ce n'était pas possible (ou au moins facilement possible).
Si votre objectif est d'avoir un emplacement de stockage temporaire facilement disponibles de l'unité, puis de créer un stockage temporaire de service.
Inscrire votre service avec l'Unité. Ensuite, lorsque vous souhaitez enregistrer un objet que vous appelez la Méthode de Dépôt et si vous souhaitez retirer l'objet que vous appelez le Retirer de la méthode.
Une explication plus complète peut être trouvé ici