J'ai une application (juste un test) qui utilise MEF et PRISM.Configurer et exposer un singleton à tous les modules d'une application MEF/PRISM
Il est assez facile de charger des exports conformes aux interfaces spécifiques et de les passer au constructeur des modules en cours de chargement, mais j'essaie de faire quelque chose de différent. Lorsque l'application démarre, elle importe une implémentation de IControllerClient.
L'instance créée doit ensuite être configurée (par le shell par exemple), après quoi chaque module de l'application doit avoir accès à .
Je ne veux pas avoir une propriété publique sur le shell ou une classe d'assistance qui expose cette instance car cela serait probablement considéré comme une mauvaise pratique ... et je ne l'aime pas vraiment.
Mise à jour:reformulant la question ci-dessous
Nous avons un certain nombre d'interfaces définies dans un cadre existant, normalement ceux-ci sont chargées à l'aide dans diverses applications MEF.
j'ai pu les charger dans un module dans une application prisme, par exemple comme ceci:
[ImportingConstructorAttribute()]
public HelloWorldView(IDataTransportService dataTransportService,
IMessageFactory messageFactory,
IDataFactory dataFactory,
IDataProcessor dataProcessor,
IDataCollector dataCollector)
{
var client = new ControllerClient(dataTransportService,
messageFactory,
dataProcessor
dataCollector);
}
Dans ce cas, le module crée une instance valide de la classe ControllerClient.
Mais au lieu de passer ces interfaces au constructeur, je veux avoir un module constructeur comme ceci:
[ImportingConstructorAttribute()]
public HelloWorldView(IClient client)
{
this.client = client;
}
Le constructeur de la mise en œuvre de iClient (ControllerClient) a le [ImportingConstructorAttribute()] pour Je m'attendais à ce que les dépences soient automatiquement injectées à ... cependant en utilisant ce code, le constructeur n'est jamais atteint. Ce que je veux est d'avoir une instance d'une interface IClient qui est utilisée par TOUS les modules dans l'application
(Je comprends maintenant Shared est la valeur par défaut pour les importations MEF).
Quelle est la meilleure façon de faire cela? Pourquoi est-ce que je ne peux pas avoir un constructeur de module prenant un IClient, et si je voulais exposer une instance d'une classe de cette façon s'il n'a pas la connaissance de mef?
Donc, dans une application mef/prism, où définiriez-vous cette instance qui peut être utilisée par tous les modules? Et est-ce ce qu'on appelle souvent un service (mais je ne pouvais trouver des conseils sur l'exposition des services avec unité/prisme). J'espère que j'ai mieux fait d'expliquer mon problème cette fois ci.
Mise à jour 2: Étant donné que le défaut est partagé pour les importations MEF, je pourrais importer la mise en œuvre de iClient dans chaque module, mais je dois comprendre pourquoi les dépendances ne sont pas injectés
Quel est le problème avec la définition d'une PartCreationPolicy? Il me semble que c'est exactement ce dont vous avez besoin. –
Je suis probablement expliquer mon problème de façon incorrecte .. Je vais essayer de le reformuler, désolé – TimothyP