J'ai un CustomersModule.cs avec la méthode initialize() suivant:Quelqu'un peut-il expliquer la magie qui se passe dans la méthode de résolution de Prism?
public void Initialize()
{
container.RegisterType<ICustomersRepository, CustomersRepository>(new ContainerControlledLifetimeManager());
CustomersPresenter customersPresenter = this.container.Resolve<CustomersPresenter>();
}
La classe I résoudre du récipient ressemble à ceci:
class CustomersPresenter
{
private CustomersView view;
private ICustomersRepository customersRespository;
public CustomersPresenter(CustomersView view,
ICustomersRepository customersRepository,
TestWhatever testWhatever)
{
this.view = view;
this.customersRespository = customersRepository;
}
}
Le TestWhatever classe est juste un classe factice J'ai créé:
public class TestWhatever
{
public string Title { get; set; }
public TestWhatever()
{
Title = "this is the title";
}
}
Pourtant, le conteneur résout heureusementCustomersPresenter
même si je ne enregistré il, et aussi le conteneur trouve en quelque sorte TestWhatever, instancie, et l'injecte dans CustomersPresenter
.
J'ai été assez surpris de réaliser ce puisque je ne trouvais nulle part dans la documentation de Prism qui indiquait explicitement que le conteneur était si automatique.
Donc c'est génial, mais qu'est-ce que le conteneur fait d'autre que je ne sais pas à propos de quoi d'autre peut-il faire que je ne connais pas? Par exemple, est-ce que je peux injecter des classes à partir d'autres modules et si les modules sont chargés, le conteneur les injectera, et sinon, il injectera une valeur null?
Mais d'où vient le découplage, c'est-à-dire si j'ai besoin d'une classe "MenuManager" d'un autre module, et que ce module n'a pas été chargé, je comprends que le conteneur devrait, par exemple. injecter une valeur nulle pour que l'application puisse fonctionner avec ou sans autres parties, mais si par ex. supprimer la classe "TestWhatever" l'application obtenir une erreur. –
Pensez-y: comment allez-vous spécifier que MenuManager doit être créé? –
Avant que le CLR n'exécute une expression comme 'Resolve();' il doit charger l'assembly contenant la définition de MenuManager. Si vous faites référence à un type dans votre code, vous forcez le chargement de l'assembly contenant cette définition de type. –