Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 24701|Répondre: 1

[Source] Autofac contrôle la portée et la durée de vie

[Copié le lien]
Publié le 19-09-2020 à 12:51:52 | | | |
Un bon article pour en apprendre davantage sur la portée et le cycle de vie du contrôle Autofac : la portée du cycle de vie est équivalente à une unité de travail dans votre application, une unité de travail commence la portée du cycle de vie au début, puis les services nécessitant cette unité sont extraits de la portée du cycle de vie.

Oscillations à vie

Créer des longescopes de vie

Créez un scope manuellement et éliminez. Les oscillations à durée de vie sont jetables et suivent l’élimination des composants, donc assurez-vous toujours d’appeler « Dispose() » ou de les envelopper dans des instructions « using ».




Objectifs de la durée de vie du label

Parfois, vous devrez partager certains services au sein d’une unité de travail, mais vous ne voulez pas utiliser les commodités de partage globale, comme le mode singleton. Par exemple, le cycle de vie par requête d’une application web, auquel cas vous pouvez utiliser InstancePerMatchingLifetimeScope pour identifier votre cycle de vie et votre service.

Par exemple, il existe un composant qui envoie le courrier, et la logique de transaction doit envoyer plusieurs messages, afin que le service de messagerie puisse être partagé dans chaque tranche de transaction logique. Si vous ne souhaitez pas que la composante email soit un singleton global, vous pouvez la définir comme suit.



Ajouter les enregistrements à un champ d’action à vie

Autofac permet d’ajouter « à la volée » lors de la création d’un cycle de vie. Cela peut vous aider lorsque vous devez faire une sorte de dérogation limitée par « soudure par points » ou si vous avez simplement besoin de quelques éléments supplémentaires dans un oscilloscope que vous ne souhaitez pas enregistrer globalement. Vous faites cela en passant un lambda à BeginLifetimeScope() qui prend un ContainerBuilder et ajoute des enregistrements. (Lors de la création d’un cycle de vie, enregistrez des services supplémentaires sans enregistrement global)



Portée de l’instance

La portée de l’instance détermine comment une instance est partagée entre requêtes. Lors de la demande d’un service, l’autofac peut retourner un seul champ d’instance, une nouvelle instance par périmètre de dépendance, ou un singleton dans un contexte, tel qu’un thread ou une requête HTTP par portée de vie. Cela s’applique aux instances retournées d’un appel explicite Resolve() ainsi qu’aux instances créées en interne par le conteneur pour satisfaire les dépendances d’un autre composant.

  • Instance par dépendance
  • Instance unique
  • Instance par portée à vie
  • Instance par portée correspondante à vie
  • Instance par requête
  • Instance par propriété
  • Portée du fil


Instance par dépendance

Également appelé « transitoire » ou « usine » dans d’autres conteneurs, il retourne une instance unique à chaque demande de service. S’il n’y a pas de cycle de vie spécifié, c’est le comportement par défaut.



Chaque dépendance Resolve renvoie un nouveau composant.



Instance unique

La même instance est retournée sur toutes les requêtes et les portées imbriquées.




Instance par portée à vie

Cette portée peut être appliquée aux oscillations imbriquées. La composante par durée de vie a un maximum d’une instance dans la portée imbriquée. C’est utile pour les objets spécifiques à une unité de travail unique qui peuvent nécessiter d’imbriquer des unités logiques supplémentaires. Chaque scope imbriqué à vie recevra une nouvelle instance de la dépendance enregistrée.



Lorsque vous analysez la composante d’instance par portée de vie, il n’y a qu’une seule instance dans chaque scope imbriqué (par exemple par unité de travail).


Instance par portée correspondante à vie

C’est similaire à l’Instance Par Durée de Portée de Vie, mais le contrôle peut être partagé avec des instances plus précises. Lorsque vous créez un cycle de vie imbriqué, vous pouvez l’étiqueter ou lui donner un nom. Un composant avec une portée par correspondance à durée de vie aura au maximum une instance unique par portée imbriquée correspondant à un nom donné. Cela permet la création de singletons à portée optique, où les cycles imbriqués peuvent partager des composantes sans créer d’instances globales.

Utile pour des unités de travail uniques, telles que les requêtes http, créées sous forme de cycles de vie imbriqués. Si une durée de vie imbriquée est créée par requête HTTP, alors tout composant avec une portée par durée de vie aura une instance par requête HTTP. (Plus d’informations sur la durée de vie par demande ci-dessous.)

Dans la plupart des applications, un seul imbriquage hiérarchique de conteneur est nécessaire pour représenter une unité de travail. Si plusieurs niveaux imbriqués sont nécessaires (par exemple, une transaction globale >requête->), des composants peuvent être créés pour être partagés à un niveau spécifique via des tags.



Lorsqu’un cycle de vie imbriqué est lancé, les balises y sont associées. Vous obtiendrez une exception si vous essayez de résoudre un composant par correspondance de portée à vie alors qu’il n’existe pas de portée à vie correctement nommée. (Si le cycle de vie de l’étiquette non enregistrée est analysé, une exception se produira.)



Instance par requête

Certains types d’applications ont naturellement une sémantique de type « requête », comme ASP.NET MVC. Parmi ces types de demandes, il est utile d’avoir une forme de « singleton par demande ». L’instance par requête s’ajoute à une instance par portée à vie correspondante en fournissant un tag bien connu pour le scope à vie, une méthode de commodité d’enregistrement et une intégration pour une application commune types (une instance par requête est construite sur le périmètre à vie correspondant en fournissant un tag à vie bien connu, une méthode de commodité d’enregistrement et une intégration pour les types d’applications courants). Essentiellement, c’est selon la portée de vie correspondante.

Cela signifie que s’il n’y a pas de requête actuelle et que vous analysez un composant enregistré en fonction de l’instance par requête, une exception sera lancée. Il y a une FAQ détaillée expliquant comment gérer les durées de vie par demande.

La connexion hyperlientérée est visible.



Instance par propriété

Possède le type de relation implicite, créant un nouveau cycle de vie imbriqué. Les dépendances peuvent être limitées à l’instance hôte en s’enregistrant avec instance-per-owned.



Dans cet exemple, le service ServiceForHandler sera limité à la durée de vie de l’instance MessageHandler possédée.



Portée du fil

Vous pouvez vous y référer

La connexion hyperlientérée est visible.

Combat réel

J’utilise le mode Instance Par Portée à Vie.

Dans winform, lorsque l’appel est exécuté, il utilise un contexte de base de données à chaque fois, comme montré dans la figure ci-dessous :



_dbContext.GetHashCode() ;
13583655
_dbContext.GetHashCode() ;
13583655
_dbContext.GetHashCode() ;
13583655

Dans le cas du multithreading et de la concurrence concurrente, si vous utilisez le même contexte de base de données, vous rencontrerez des exceptions lors de l’ajout, de la suppression, de la modification ou de la vérification de la base de données.

Je veux que l’autofac renvoie un nouvel objet à chaque clic sur le bouton, le code est le suivant :


Comme montré ci-dessous :



(Fin)




Précédent:.NET/C# Texte filigrané pour des images en pavage
Prochain:ASP.NET Interdire l’accès aux fichiers journaux sous forme d’URL
Publié le 08-09-2022 à 09:58:24 |
Exactement ce dont nous avons besoin
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com