je l'architecture suivante où une classe de service public référence à une classe interne d'assistance existe dans un autre ensemble:Injecter une classe d'aide interne tout en résolvant une classe publique
ApplicationAssembly {
public class Widget {
public Widget(ReferencedAssembly.Service service) { ... }
}
}
ReferencedAssembly {
public class Service {
public Service(Helper helper) { ... }
}
class Helper { ... }
}
(je me rends compte que je ne peux pas mettre classe interne dans les arguments du constructeur d'une classe publique - j'essaie juste d'illustrer le motif IoC que je vais après.)
Le problème est que ApplicationAssembly ne peut pas voir ReferencedAssembly.Helper, donc il peut ' t être enregistré dans mon conteneur IoC (autofac dans ce cas). Par conséquent, Helper ne peut pas être résolu lorsque j'essaie de résoudre le service. Quelle est ma meilleure option ici?
Option 1. Supprimez Helper du constructeur de Service et recréez-le explicitement dans le constructeur. Je n'aime pas cette option parce qu'elle brise le paradigme de l'IoC.
Option 2. Faites en sorte que Helper implémente une interface publique IHelper, puis ajoutez un module public dans ReferencedAssembly qui enregistre Helper en tant que IHelper. Je n'aime pas cette option car elle nécessite que ApplicationAssembly connaisse trop de détails d'implémentation à propos de Service, et si l'utilisateur oublie d'enregistrer ce module au démarrage, tout se casse.
Option 3. Créez un constructeur statique public sur Service qui crée un deuxième conteneur IoC spécifiquement pour ReferencedAssembly et y inscrit Helper. Supprimez Helper du constructeur de Service et résolvez-le dans le constructeur en utilisant le deuxième conteneur IoC. Cela semble être ma meilleure option, mais nécessite plus de code "plomberie" que les autres. Je ne suis pas non plus un grand fan des constructeurs statiques publics.
Option 4. Changez mon architecture pour autre chose.
Qu'en est la solution la plus simple et la meilleure (rasoir d'Occam): il suffit de rendre le type public –
+1 à cela aussi :) –