6
votes

Paramètre Autofac Passage et mise au point automatique

Impossible d'obtenir ma tête autour du paramètre passant dans Autofac, le code suivant ne fonctionne pas: xxx

qui jette: xxx

mais le code suivant fait fonctionne: xxx


2 commentaires

Votre question n'est pas très claire. Pour ceux d'entre nous qui ne sont pas des utilisateurs d'autofac, pourriez-vous montrer les déclarations de p, config, typedparameter.from et conteneur.Resolve? En outre, veuillez spécifier de quelle manière il "ne fonctionne pas" - Compilez l'erreur d'heure? Exception?


clarifié avec un exemple runnable à par exemple. LINQPAD (référence Autofac.dll)


3 Réponses :


0
votes

Autofac essaye évidemment de résoudre le paramètre de votre classe de configuration dans l'hypothèse que le dictionnaire lui-même est un type résolvable. Je ne connais pas la syntaxe Autofac sur la façon de le faire. Mais vous devez probablement faire plus d'étapes lorsque vous enregistrez le type de configuration, e. g. lui donner un délégué qui passe dans un nouveau dictionnaire.


6 commentaires

tu as raison! Mais ensuite, le problème suivant se pose, si je vous inscris à la configuration comme suit à la place: Builder.register ((C, P) => Nouvelle config (P.TYPEDAS > ())); p est vide à la résolution du temps!


Hm. C'est peut-être parce que vous donnez un délégué à Autofac, mais le délégué n'a toujours pas le dictionnaire au moment de l'exécution. Essayez de fournir un nouveau dictionnaire dans votre délégué, quelque chose comme ceci (soyez conscient, je ne connais toujours pas les forums exacts pour Autofac): Builder.register ((c) => Nouvelle config (Nouveau Dictionnaire ()) );


Est-ce que cela ne donnera-t-il pas toujours un dictionnaire vide? Malgré les arguments passés à la résolution de temps?


Oui, il sera. Dans votre code d'exemple, vous faites la même chose à résoudre le temps, creille un nouveau dictionnaire et mettez-le dans la configuration.


haha, vrai;) Mais le point est la possibilité d'injecter des paramètres personnalisés. Le contenu du dictionnaire ne serait connu qu'au runtime.


Est-ce ce que tu fais? code.google.com/p/autofac/wiki/resolveParameters



19
votes

Répétant ici la réponse de la liste de diffusion Autofac:

Les paramètres passés à la résolution uniquement liés à la mise en œuvre directe de le service que vous résolvez, de sorte que les paramètres de configuration de la configuration à la résolution appel à la consommation ne fonctionnera pas. Le moyen de changer votre consommateur d'enregistrement à: xxx


2 commentaires

Je suppose que vous voulez dire: Builder.register ((C, P) => Nouveau consommateur (C.Resolve (p))); parce que cela fonctionne Perfetct! Merci Nicholas!


Par "enfin quelqu'un qui connaît Autofac", vous voulez dire l'auteur, oui sûr :)



0
votes

Malheureusement, les conteneurs de CIO comme Autofac ne sont pas équipés d'une "Veuillez lire mon module d'esprit".

Ce que vous essayez de faire est de dire essentiellement "Je sais que l'un des types impliqués ici a besoin d'un dictionnaire et j'ai besoin d'un service de consommateur de type, pouvez-vous s'il vous plaît essayer de comprendre ce que je prends à propos et juste faire la bonne chose ? ".

Si vous résolvez un service et spécifiez un paramètre, ce paramètre sera tenté d'être utilisé pour ce service particulier. Le conteneur n'essaiera pas de propager cette valeur de paramètre à aucune dépendance.


5 commentaires

Bien sûr, ma première tentative était naïve, mais pas une voie à suivre, si les paramètres avaient été marre comme des inscriptions au travail?


Pourrait être, Autofac devrait alors être capable de le comprendre, mais vous devez pré-enregistrer les paramètres comme services avec Autofac. Personnellement, je ne recommande pas de services avec des paramètres de constructeur, il est invariablement un service qui fuit car il félive les détails de la mise en œuvre dans le code qui l'utilise, rend plus difficile la remplacement du service. Considérez comme exemple un service où vous passerez un nom de fichier de configuration, qu'est-ce que vous décidez ensuite d'utiliser un service qui lit la configuration à partir d'une base de données?


Oui, je sais, ma solution n'est pas sur place, mais la chose est, je souhaite que l'utilisateur puisse configurer quel type de service à utiliser. Mais ce service a également besoin de configurations différentes, alors maintenant ces configurations de service sont transmises sous forme de cadtion .. J'adorerais de meilleures solutions, mais cette fausse chose est ma meilleure tentative jusqu'à présent ..


Vous ne pouvez pas simplement créer des fournisseurs de configuration en tant que services, interfaces avec une méthode en eux qui renvoie ce dictionnaire? De cette façon, vous pouvez facilement tester le code (fournissez une configuration entraînée par code), ainsi que de câbler votre code sans avoir à spécifier de configuration sur le site d'appel.


@ Lassev.karlsen, je pense que les constructeurs sont des détails de la mise en œuvre, donc cela ne le fait pas fuir. (Voir blog.ploeh.dk/2011/02/28/interfacesAreaccesModificateurs ). Où préférez-vous mettre la configuration requise, sinon dans la racine de la composition?