Constructeur Injection en C#/Unity?
Je suis à l'aide de C# avec Microsoft Unité du cadre. Je ne suis pas tout à fait sûr de savoir comment résoudre ce problème. Il a probablement quelque chose à voir avec mon manque de compréhension DI avec l'Unité.
Mon problème peut être résumé à l'aide de l'exemple de code suivant:
class Train(Person p) { ... }
class Bus(Person p) { ... }
class Person(string name) { ... }
Person dad = new Person("joe");
Person son = new Person("timmy");
Lorsque j'appelle la méthode resolve sur le Bus comment puis-je être sûr que la Personne "fils" avec le nom "timmy" est injecté et lors de la résolution de Train comment puis-je être sûr que Personne "papa" avec le nom de " joe " est-il résolu?
Je pense peut-être utiliser les instances nommées? Mais je suis à une perte. Toute aide serait appréciée.
En aparté, je préfère ne pas créer une interface IPerson.
OriginalL'auteur JP Richardson | 2010-01-06
Vous devez vous connecter pour publier un commentaire.
Une façon de résoudre ce problème serait d'utiliser une injection de constructeur avec un nom d'enregistrement.
OriginalL'auteur Daniel Auger
Sauf si vous vous inscrivez, respectivement, "joe" et "timmy" comme l'appellent les dépendances, vous ne pouvez pas être sûr que "timmy" est injecté dans l'autobus scolaire. En fait, si vous tentez d'enregistrer deux instances de la même classe que sans nom dépendances, vous aurez un ambigu de l'installation, et vous ne serez pas en mesure de résoudre
Person
à tous.En général, si vous devez vous inscrire beaucoup d'instances nommées, vous allez probablement à propos de DI dans le mauvais sens. L'idée principale de DI est de résoudre les Services de Domaine plus de Objets du Domaine.
L'idée principale de DI est de fournir un mécanisme qui permet de résoudre des résumé types (interfaces ou des classes abstraites) dans les types de béton. Votre exemple n'a pas de résumé types, de sorte qu'il n'a pas vraiment beaucoup de sens.
C'est juste assez, vous voudrez peut-être lire mon livre, alors 🙂
JP, faire vérifier son livre. Je l'ai trouvé pour être très perspicace.
Génial... ça ça a l'air intéressant. Je viens de commencer à lire l'intro du chapitre.
que dire de l'injection de ressources partagées, c'est à dire un
ConcurrentQueue<T>
partagé entre deux contrôleurs? Est également un candidat valide pour l'injection de dépendances?OriginalL'auteur Mark Seemann
Marque Seeman a raison. Et je compatis à votre confusion. Je suis passé par là moi-même quand j'ai appris à utiliser automatique de l'injection de dépendance des conteneurs. Le problème est qu'il y a beaucoup de valable et raisonnable de la manière de concevoir et d'utiliser des objets. Pourtant, seulement certains de ces approches automatique de dépendance injectorion conteneurs.
Mon histoire personnelle: j'ai appris OO principes de construction de l'objet et de l'Inversion De Contrôle à long avant que j'ai appris comment utiliser l'Inversion de Contrôle des conteneurs comme l'Unité ou le Château de Windsor conteneurs. J'ai acquis l'habitude de l'écriture de code comme ceci:
Dans cette conception, ma classe Foo est responsable pour les comptes d'épargne à la base de données. Il a besoin d'un numéro de compte de service pour faire le sale travail. C'est un peu comme le béton les classes que vous avez fournis ci-dessus, où chaque objet prend un peu de valeurs uniques dans le constructeur. Cela fonctionne bien lorsque vous instancier les objets avec votre propre code. Vous pouvez passer dans les valeurs appropriées au bon moment.
Cependant, lorsque j'ai appris automatique de l'injection de dépendance des contenants, j'ai trouvé que je n'étais plus l'instanciation de Foo à la main. Le conteneur de instancier les arguments du constructeur pour moi. Cela a été d'une grande utilité pour les services comme IService. Mais il est évident qu'elle ne fonctionne pas si bien pour les entiers et des chaînes et de la comme. Dans ces cas, il serait de fournir une valeur par défaut (comme zéro pour un entier). Au lieu de cela, j'avais l'habitude de passer dans le contexte spécifique de valeurs telles que numéro de compte, nom, etc... Donc j'ai dû adapter mon style de codage et de conception de l'être comme ceci:
Il semble que les deux Foo classes sont valables dessins. Mais le second est utilisable avec coupure automatique de l'injection de dépendance, et la première ne l'est pas.
Comme une question de fait, il doit être foo.SaveAccount(1234) 🙂
Intéressant non pas sur la
int
d'initialisation. J'ai juste eu très similaire (totalement différent de domaine) où j'avais besoin d'initialiser délai d'attente -- abstraite à une méthode,OriginalL'auteur David Allen