Comment faire pour résoudre interface basée sur le service où il est passé à
J'ai une interface.
public interface ISomeInterface {...}
et deux implémentations (SomeImpl1 et SomeImpl2):
public class SomeImpl1 : ISomeInterface {...}
public class SomeImpl2 : ISomeInterface {...}
J'ai également deux services où j'ai injecter ISomeInterface (via le constructeur):
public class Service1 : IService1
{
public Service1(ISomeInterface someInterface)
{
}
...
}
et
public class Service2 : IService2
{
public Service2(ISomeInterface someInterface)
{
}
...
}
Je suis en utilisant Autofac comme mon outil IoC.
La question. Comment puis-je configurer Autofac enregistrements de sorte SomeImpl1 sera automatiquement injecté dans Service1, et SomeImpl2 sera automatiquement injecté dans Service2.
Merci!
Vous devez vous connecter pour publier un commentaire.
Autofac prend en charge identification des services par nom. Grâce à lui, vous pouvez enregistrer vos implémentations avec un nom (à l'aide de la
Named
méthode d'extension). Vous pouvez ensuite régler entre eux par leur nom dans le IServiceX d'inscription des délégués, à l'aide de laResolveNamed
méthode d'extension. Le code suivant illustre cette.Alternative à l'aide
RegisterType
(par opposition àRegister
)Vous pouvez obtenir le même résultat à l'aide de la
RegisterType
méthode d'extension en combinaison avecWithParameter
etResolvedParameter
. Cela est utile si le constructeur prenant un paramètre nommé prend également d'autres non-nommé de paramètres que vous n'avez pas soin de préciser, dans un enregistrement délégué:RegisterType
.Si vous pouvez passer du constructeur d'injection à la propriété de l'injection, et de laisser les deux services proviennent de la même classe de base (ou de mettre en œuvre la même interface), vous pouvez effectuer les opérations suivantes:
Pour que cela fonctionne, vous devez définir la propriété sur le type de base (ou l'interface). Cette solution est très flexible et pourrait même vous permettre de choses complexes tels que l'injection d'un type générique, basé sur le type parent, comme on peut le voir ci-dessous:
Cette approche a quelques inconvénients:
À la hausse, cette conception est simple et fonctionne pour presque n'importe quel conteneur.
Quatre variantes de faire cela est décrit dans autofac documentation:
Option 1: La Refonte De Vos Interfaces
Option 2: Modifier les Enregistrements
Vous pouvez associer manuellement le type approprié avec la consommation de la composante de cette façon:
Option 3: Utilisation D'Un Détrompeur Services
Option 4: Utilisation Des Métadonnées