2010-11-17 33 views
1

est-il possible de fournir un initialisateur d'objet Lazy à un conteneur MEF?Fournir un délégué à l'initialisation MEF

Ici, il est un exemple:

[Export] 
public class Bar 
{ 
    [ImportingConstructor[ 
    public Bar([Import] Lazy<Foo> foo) 
    { 
    // [..] 
    } 
} 

TypeCatalog catalog = new TypeCatalog(typeof(Bar)); 
CompositionContainer container = new CompositionContainer(catalog); 
Lazy<Foo> initializer = new Lazy(() => 
{ 
    Foo foo = new Foo(); 
    // foo initialization here 
    return foo; 
}); 
container.ComposeExportedValue(initializer); 
CompositionBatch batch = new CompositionBatch(); 
container.Compose(batch); 
var export = container.GetExportedValue<Bar>(); // composition fails 

Ce morceau de code ne fonctionne pas, alors que cela fonctionne si je l'appelle container.ComposeExportedValue (nouveau Foo()). Je voudrais passer directement un délégué pour créer l'objet paresseux. Est-ce possible sans avoir besoin d'un fournisseur d'exportation personnalisé?

Merci

Répondre

1

Lazy<T> a une signification particulière pour les importations MEF. Plutôt que de chercher littéralement une exportation Lazy<T>, MEF recherchera une exportation T et instanciera cette partie paresseusement.

Essayez d'utiliser ce type à la place pour vos importations et les exportations:

public class LazyPart<T> : Lazy<T> 
{ 
    public LazyPart(Func<T> initializer) : base(initializer) 
    { 
    } 
} 

Comme il est un autre type, il ne devrait pas contenir une signification particulière pour MEF.