Impossible d'obtenir ma tête autour du paramètre passant dans Autofac, le code suivant ne fonctionne pas: qui jette: p> mais le code suivant fait em> fonctionne: p>
3 Réponses :
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. P>
tu as raison! Mais ensuite, le problème suivant se pose, si je vous inscris à la configuration comme suit à la place: Builder.register
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
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 à: p>
Je suppose que vous voulez dire: Builder.register ((C, P) => Nouveau consommateur (C.Resolve
Par "enfin quelqu'un qui connaît Autofac", vous voulez dire l'auteur, oui sûr :)
Malheureusement, les conteneurs de CIO comme Autofac ne sont pas équipés d'une "Veuillez lire mon module d'esprit". P>
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 em>? ". P>
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. P>
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
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?
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)