(depuis le fichier StockTraderRIBootstrapper.cs dans l'exemple d'application StockTrader Prism V2)
Quelle est la différence entre ceci :
ShellPresenter presenter = new ShellPresenter();
et ceci :
ShellPresenter presenter = Container.Resolve();
- Je comprends que le deuxième exemple traite le conteneur comme une usine, allant vers lui en disant "J'ai besoin d'un objet instancié de type ShellPresenter".
- Mais que se passe-t-il si, par exemple, j'ai besoin d'envoyer des paramètres, quelle serait l'équivalent de "new ShellPresenter(1, true)" etc.?
- Et étant donné que le Container doit être informé au sujet de ShellPresenter, je m'attendais à trouver quelque part dans le projet un endroit où la classe ShellPresenter est enregistrée avec le conteneur, par exemple je m'attendais
à quelque chose comme ceci :
Container.RegisterType();
mais je ne l'ai trouvé nulle part. Comment le conteneur apprend-t-il à propos de ces types pour pouvoir les .Resolve ? J'ai reconstruit ceci dans son propre projet et j'obtiens une erreur "Resolution of the dependency failed", où dois-je enregistrer cette dépendance alors ?
Toute direction/discussion ici serait utile.
Réponse Inexpliquée :
Ainsi, dans le bootstrapper, lorsque j'enregistre le Shell lui-même :
protected override void ConfigureContainer()
{
Container.RegisterType();
base.ConfigureContainer();
}
ensuite, le Conteneur peut résoudre le type ShellPresenter. Comment le type ShellPresenter est-il enregistré lorsque j'enregistre le type Shell ?
La Réponse Surprenante :
D'accord, il s'avère que vous n'avez pas besoin d'enregistrer le type que vous essayez de résoudre mais vous devez enregistrer les types de paramètres (interfaces) passés au constructeur du type que vous essayez de résoudre, c'est-à-dire que puisque j'injecte l'interface IShellView dans le constructeur de mon ShellPresenter, j'ai dû enregistrer le type IShellView et non le type IShellPresenter :
public ShellPresenter(IShellView view) ...
J'ai testé ceci en essayant de résoudre le type Tester :
Tester tester = Container.Resolve();
Tant que j'injecte SomeClass dans son constructeur :
public Tester(ISomeClass someClass)
J'obtiens des erreurs de dépendance non résolues jusqu'à ce que j'enregistre SomeClass avec le conteneur :
Container.RegisterType();
Ensuite, ça fonctionne. C'est aussi surprenant qu'éducatif. Cela doit rentrer. Je vais prendre un café et réfléchir à cela pendant un moment.
Si quelqu'un pouvait expliquer pourquoi c'est le cas, ce serait très apprécié.