So che ci sono state molte domande sull'iniezione dei parametri del costruttore tramite MEF, ma il mio è un po 'diverso.MEF: passaggio di diversi parametri del costruttore a una parte quando si utilizza CreationPolicy.NonShared
Desidero sapere che esiste un modo per passare valori di parametri diversi al costruttore di una parte quando utilizzo la combinazione di PartCreationPolicy(CreationPolicy.NonShared)
e GetExportedValue
?
Ad esempio:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export]
public partial class Foo
{
[ImportingConstructor]
public Foo([Import("SomeParam")]object parameter)
{
...
}
}
e da qualche altra parte ...
container.ComposeExportedValue("SomeParam", "Some value...");
var instance = container.GetExportedValue<Foo>();
Nell'esempio di cui sopra, posso usare ComposeExportedValue
solo una volta, come l'esecuzione di una seconda volta causerà un ChangeRejectedException
.
Quindi, le mie domande sono:
- C'è un altro modo per cambiare il valore della
SomeParam
nello scenario precedente, per ogni nuova istanza? - In caso contrario, quali sono gli altri modi in cui questo può essere realizzato senza utilizzare altri framework DI? Una cosa che viene in mente è creare un servizio per esporre qualcosa come
System.Collections.Concurrent.ConcurrentQueue
dove accodare un valore di parametro prima di chiamareGetExportedValue
e quindi dequotare il valore nel costruttore della parte. Ma questo è un trucco e crea anche più problemi di quanti ne risolva. - Se la risposta a entrambe le domande sopra è no, allora ci sono altri modi per ottenere questo risultato con una combinazione di MEF e qualche altro framework DI/IOC?
Grazie per qualsiasi aiuto. :)
Saluti,
Yogesh Jagota
sto guardando autofac/MEF integrazione ma come posso gestire la registrazione quando si utilizza 'RegisterComposablePartCatalog'? Non riesco ad usare 'Register' qui come è stato fatto automaticamente da AutoFac. Come posso dire ad AutoFac che una certa esportazione deve essere istanziata usando un costruttore non predefinito con i parametri che fornisco senza usare '[ImportingConstructor]'? – Yogesh
@ Yogesh: è possibile avere alcuni componenti registrati con AutoFac (quando è necessario il controllo a grana fine) e altri esportati con MEF (quando è necessario il rilevamento dinamico dei plug-in). Ma non è possibile mescolare entrambi per lo stesso componente. Un'altra opzione è quella di passare completamente ad AutoFac; puoi utilizzare [Scansione] (http://code.google.com/p/autofac/wiki/Scanning) per ottenere una scoperta dinamica simile a MEF dove necessario. –
Ha funzionato davvero. Il modo per farlo è utilizzare il metodo 'Update' di' IContainer' che consente di aggiungere nuove registrazioni a un contenitore esistente. Grazie. :) – Yogesh