10
votes

Autofac Conterbuilder.Build est-il une opération coûteuse?

Je commence à utiliser Autofac et je n'arrive pas à trouver une réponse à cette question.

aussi, quand devrais-je appeler conteneurbuilder.build ()?

Après avoir appelé le conteneurbuilder.build () est-il possible d'enregistrer un autre type ou instance?


0 commentaires

4 Réponses :


4
votes

conteneurbuilder.build () devrait généralement être appelé lors du démarrage de l'application avant de commencer à invoquer le comportement commercial.

Si vous devez enregistrer des composants supplémentaires dans un conteneur existant, vous pouvez. Pour ce faire dans Autofac V2.2.2 (ou la version ultérieure), vous pouvez créer un autre instantané de conteneurBuilder et utiliser la méthode de surcharge de conteneurbuilder.build (iContainer).


4 commentaires

La méthode conteneur-conteneurbuilder.build (iContainer) est uniquement dans Autofac V1, je crois. Dans Autofac V2, cela a été supprimé. Depuis v2.2, vous pouvez modifier à nouveau des conteneurs avec le nouveau ContainerBuilder.Pate (iContainer) méthode.


Merci wim. D'une manière ou d'une autre, vous avez réussi à répondre à ma question avec la méthode de mise à jour. De cette façon, je peux appeler la construction () une fois et appeler la mise à jour chaque fois que de nouveaux registres apparaissent.


Depuis lors, la construction ne contient pas de paramètre IConTenerer et de mise à jour est marquée comme obsolète. Toute solution?


Je me demande la même chose. Cette réponse n'est plus valide. Si nous convenons que les conteneurs devraient être immuables, il ne devrait y avoir qu'une seule par application et que update () est obsolète. Quelle est la meilleure façon d'enregistrer des choses qui nécessitent un conteneur existant afin de résoudre quelque chose nécessaire pour enregistrer les choses ultérieures? J'ai créé une question Stackoverflow.com/Questtions/53045767/...



1
votes

Dans mes applications Web, j'utilise une classe de base httpApplication qui appelle la construction de l'événement Application_Start. J'utilise ensuite un mélange de modules (placé sur chaque assemblée nécessitant une inscription), a Assemblage "Scanner" et Intégration MVC .

Pour l'enregistrement ultérieur, vous pouvez utiliser, par exemple, le Intégration Mef , Ou, comme l'a dit Jonathan, utilisez la surcharge de construction.

espère qu'il aide :)


0 commentaires

5
votes

Je ne peux pas vous dire si la méthode de construction est chère ou non, mais si vous suivez le Enregistrer Résolvez le modèle de version Peu importe car vous ne devez avoir que une instance de conteneur unique par application.

Vous devez appeler la méthode de construction une fois pour obtenir une instance de conteneur, donc peu importe la manière dont il est coûteux (ou non), c'est un coût que vous devez payer . Toutefois, lorsque vous n'utilisez qu'une seule instance du conteneur, vous PAYEZ UNIQUEMENT COÛT une fois .


4 commentaires

Mark, vous n'avez pas répondu à mes questions et c'est la raison du -1. Je n'ai aucun problème à le supprimer au cas où vous modifiez votre réponse.


Avez-vous lu le lien? Si vous prenez un pas en arrière et faites cela, vous vous rendrez compte que les réponses à vos questions sont en grande partie dénuées.


Mark, vous ne devriez pas envisager mes questions non pertinentes, car vous ne savez pas quel problème j'ai entre mes mains. Si je posais ces questions, c'est parce qu'ils sont pertinents pour moi. Le motif de libération de registre-Resolve peut être appliqué à la plupart des situations, mais pas dans la mienne.


@Rodrigoguerreiro Je suis d'accord, parfois, vous voudrez peut-être segmenter l'application dans différentes unités de travail (telles que ce que fait ASP.NET), puis il devient beaucoup plus pratique d'avoir une sorte de manière structurée pour créer un certain nombre de cycles de RRR. pendant la durée de vie de l'application. L'alternative consiste à utiliser des clés d'enregistrement, mais cela tend à s'embrouiller très rapidement et est facile de se tromper. Pour Autofac, je me suis installé sur l'utilisation des champs de vie des enfants, qui dans les dernières versions disposent d'un constructeur qui vous permet d'enregistrer les choses directement. Très utile.



3
votes
ContainerBuilder _AutoFacContainerBuilder;
IContainer _AutoFacContainer;

_AutoFacContainerBuilder.RegisterType<MyClass>().Named<IMyClass>("MyNameOne");
_AutoFacContainer = AutoFacContainerBuilder.Build();


ContainerBuilder _AnotherBuilder;

_AnotherBuilder.RegisterType<MyClassTwo>().Named<IMyClassTwo>("MyNameTwo");
_AnotherBuilder.Update(_AutoFacContainer);

0 commentaires