2017-07-03 1 views
0

J'utilise un conteneur Autofac pour toute la durée de vie de mon application, mais je souhaite disposer des composants moi-même.Conteneur Autofac-externe?

IE si je builder.RegisterType<SomeType>(), je ne veux pas le conteneur pour garder les références de SomeType qui gardera en vie, même si ceux non référencés nulle part ailleurs (si RegisterInstance est utilisé OTOH, puis bien sûr le récipient doit conserver une référence à le singleton).

Je peux voir que je peux faire builder.RegisterType<SomeType>().ExternallyOwned() qui résout mon problème pour un type, mais je ne veux pas l'écrire pour chaque type, et plus important encore, j'utilise également builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); qui ne me donne pas la possibilité d'utiliser ExternallyOwned.

Existe-t-il un moyen de spécifier "ExternallyOwned" pour le conteneur entier? Ou, pour le dire autrement, dites au conteneur de désactiver toute la fonction de disposition et de ne pas conserver de références pour les objets dont il n'a pas besoin?

+0

Je considérerais les méthodes d'extension sur ContainerBuilder afin que vous puissiez écrire builder.RegisterExternalType () et obtenir ce que vous vouliez sans appeler explicitement deux méthodes partout. – Mithon

+0

Ce n'est pas assez bon, car comme je l'ai dit, j'utilise aussi 'builder.RegisterSource (new AnyConcreteTypeNotAlreadyRegisteredSource());' – tzachs

+0

Ah. Je vois. J'ai raté cette partie. Ensuite, il vous reste à écrire votre propre source d'enregistrement, je suppose. Et honnêtement, si vous regardez à quel point cette source est mince, ce n'est pas vraiment un gros travail. :) – Mithon

Répondre

1

Il n'existe aucun moyen de désactiver les services d'élimination des conteneurs. Vous pourriez essayer de vous connecter avec something like the logging module mais je pourrais voir que cela ne fonctionne pas à 100% et les cas de bord manquants de vous ne faites pas attention.

Le suivi et l'élimination automatiques sont une caractéristique assez commune du conteneur. Je recommande au lieu de le combattre que vous refactoriez votre code pour l'adopter. Ça va rendre la vie beaucoup plus facile.

+0

Merci pour la réponse. Je ne peux pas vraiment voir comment je peux refactoriser mon code pour embrasser l'élimination automatique. Je veux dire, c'est une fonctionnalité vraiment pratique à avoir quand vous faites des workflows d'unités de travail, où une fois que vous avez terminé votre travail, vous disposez du conteneur et tout ce qu'il contient. Mais, dans mon cas, j'écris un moteur de jeu et j'utilise le conteneur pour pouvoir tout personnaliser. Il n'y a pas d'unité de travail, le développeur du jeu peut générer un ennemi ou charger un effet de texture/son quand il le veut tout au long du jeu, donc la vie du conteneur et ses objets créés ne sont pas liés du tout. – tzachs

+0

Si c'est la réponse (si elle résout le problème ou non, c'est la réponse réelle à la question), s'il vous plaît acceptez-le afin que je puisse obtenir un crédit. –

+0

J'espère toujours que quelqu'un arrivera à trouver une solution magique. S'il n'y a pas de réponse dans quelques jours, j'accepterai votre réponse. – tzachs