Microsoft L'Unité. Comment spécifier un certain paramètre dans le constructeur?
Je suis à l'aide de Microsoft à l'Unité. J'ai une interface ICustomerService
et sa mise en œuvre CustomerService
. Je peux les enregistrer pour l'Unité de conteneur en utilisant le code suivant:
container.RegisterType<ICustomerService, CustomerService>(new TransientLifetimeManager());
Si CustomerService
a un certain paramètre de son constructeur (par exemple ISomeService1
), j'utilise le code suivant (j'ai besoin de spécifier SomeService1
):
container.RegisterType<ICustomerService, CustomerService>(new TransientLifetimeManager(), new InjectionConstructor(new SomeService1()));
Pas de problèmes ici.
Le problème apparaît lorsque CustomerService
de classe dispose de deux paramètres (pas un seul param comme dans l'exemple précédent) dans son constructeur (par exemple ISomeService1
et ISomeService2
). Il fonctionne très bien lorsque je suis en utilisant le code suivant:
container.RegisterType<ICustomerService, CustomerService>(new TransientLifetimeManager(), new InjectionConstructor(new SomeService1(), new SomeService2()));
Le problème est que je ne veux pas spécifier SomeService2()
pour le deuxième paramètre. Je tiens à préciser que premier paramètre - SomeService1()
. Mais je reçois le message d'erreur que j'ai besoin de spécifier aucun des deux ou les deux paramètres.
Comment puis-je spécifier que premier paramètre du constructeur?
- Salut et.maz, avez-vous une solution dans laquelle vous avez besoin de ne pas donner à l'autre, les paramètres de type. quelque chose comme valeur de clé où l'on peut spécifier le nom du constructeur et la valeur
Vous devez vous connecter pour publier un commentaire.
Votre meilleure réponse est d'utiliser effectivement le conteneur.
Ce que vous faites en disant: "lors de la construction de ce type, l'utilisation spécifique de cette instance de l'objet." Ce n'est pas de profiter de la capacité du conteneur à construire instance pour vous. Au lieu de cela, vous devez vous inscrire IService1 et IService2 dans le conteneur. Alors, dites-le conteneur de résoudre ces dépendances pour vous.
Il ressemble à quelque chose comme ceci:
Ce que cela fait, c'est dire le récipient "dès qu'il y a une dépendance de type IService1, les nouvelles en place d'un nouvel objet de type SomeService1 et de la main-ce qui" et de même pour IService2.
Alors, la prochaine, vous devez indiquer au conteneur de quoi faire à propos de ICustomerService. Dans la plupart des généralité, vous devrez faire cela:
Cela indique au conteneur: lors de la résolution de ICustomerService, les nouvelles en place une instance de CustomerService en utilisant le constructeur qui prend IService1 et IService2. Pour obtenir ces paramètres, de retour d'appel dans le récipient pour résoudre ces types de.
C'est un peu verbeux, et un cas commun, donc il y a quelques raccourcis. Tout d'abord, vous pouvez passer d'un Type d'objet au lieu de faire de nouveaux ResolvedParameter, comme suit:
Comme une autre abréviation, si CustomerService a qu'un seul constructeur, ou si celui que vous voulez appeler est celui qui prend la plus grande liste de paramètres, vous pouvez laisser le InjectionConstructor complètement, comme c'est le constructeur qui le conteneur va chercher dans l'absence de toute autre configuration.
Le formulaire que vous utilisez est généralement utilisé lorsque vous souhaitez une valeur spécifique passé pour un paramètre du constructeur plutôt que de résoudre le service de retour à travers le récipient.
Pour répondre à votre question initiale - eh bien, vous ne pouvez pas faire exactement ce que vous avez dit. Le paramètre de constructeur a besoin d'Une valeur de quelque sorte. Vous pourriez mettre autre chose dans la vous voulez, bien que nulle fonctionne normalement.
Remarque vous pouvez également mélanger les deux formes. Par exemple, si vous voulez résoudre IService1 et passer la valeur null pour le IService2 paramètre, faites ceci:
* EDIT *
Basé sur le commentaire ci-dessous, ce que vous voulez vraiment est une autre caractéristique nommée enregistrements.
En gros, vous avez deux implémentations de IService1 et l'un des IService2. Donc, ce que vous pouvez faire est de vous inscrire à la fois, puis de dire le récipient à utiliser.
Tout d'abord, pour inscrire le deuxième de la mise en œuvre, vous avez besoin de donner un nom explicite:
Alors vous pouvez dire le récipient pour résoudre IService1 mais utiliser le nom. C'est la principale raison que la ResolvedParameter type n'existe. Puisque vous voulez juste valeur par défaut pour IService2, vous pouvez utiliser typeof() comme une abréviation. Vous avez encore besoin de spécifier les types des paramètres, mais vous n'avez pas besoin d'une valeur spécifique. Si cela a un sens.
Qui devrait faire ce que vous avez besoin.
Comme une alternative de Chris Tavares de réponse, vous pouvez laisser le conteneur de résoudre seul le deuxième paramètre:
Chris Tavares a donné une bonne réponse avec beaucoup d'informations.
Si vous avez beaucoup de Paramètres à injecter habituellement, ce sont des interfaces ou des instances qui peuvent être résolus par l'Unité (à l'aide de la differnet techniques). Mais que faire si vous voulez fournir un seul Paramètre qui ne peut pas être résolu automatiquement, par exemple, une chaîne de caractères pour un nom de fichier?
Maintenant, vous devez fournir tous les
typeof(IMyProvider)
et d'une chaîne ou d'une instance. Mais pour être honnête, juste à fournir les types de pourrait être fait par l'Unité, parce que l'Unité a déjà une stratégie pour choisir le meilleur ctor.Donc j'ai codé un remplacement pour
InjectionConstructor
:Utilisation:
Vous pouvez utiliser les conteneurs de la hiérarchie. Registre commune de mise en œuvre dans le conteneur parent, cette instance permettra de résoudre si résolu par le master conteneur. Puis créer conteneur enfant, et de s'inscrire alternative de mise en œuvre de l'enfant du conteneur. Cette mise en œuvre résoudre Si résolu par conteneur enfant, c'est à dire de l'inscription de l'enfant dans le conteneur des remplacements d'inscription dans le conteneur parent.
Voici l'exemple:
Veuillez noter que l'utilisation de conteneurs de la hiérarchie, vous pouvez ne savent rien sur le nombre de paramètres dans le constructeur, et c'est très bien, parce que tant que vous êtes lié à des paramètres de comptage et de leurs types, vous ne pouvez pas utiliser la pleine puissance de la Coi. Moins vous en savez, mieux c'est.
Vous pouvez par défaut de la deuxième paramètre du constructeur (par exemple,
=null
) ou de proposer un seul paramètre du constructeur en plus de ces deux paramètre de constructeur par le surcharger.