Question

Comme je sais que si une variable est déclarée Lazy, alors son constructeur est appelé lorsque nous utilisons la propriété Value.

Je dois passer des paramètres à cette instance de Lazy mais ne peut pas trouver la syntaxe correcte. Ce n'est pas ma conception, j'utilise MEF et ExportFactory, il me retourne Lazy cas de mes pièces. Mes pièces ont des constructeurs et je dois appeler ces constructeurs avec certains paramètres.

Était-ce utile?

La solution

MEF ne dispose pas d'une manière intégrée pour vous de passer des paramètres du constructeur à une partie lors de sa création avec une usine à exporter. Quelque chose comme ce que Wim Coenen suggère est probablement la meilleure façon d'obtenir ce que vous voulez.

Autres conseils

Vous pouvez exporter votre propre Func à la place:

public class FooFactory
{
    [Export(typeof(Func<string,int,ExportLifetimeContext<IFoo>>))]
    public ExportLifetimeContext<IFoo> CreateFoo(string param1, int param2)
    {
        Foo foo = new Foo(param1, param2);
        return new ExportLifetimeContext<IFoo>(foo,
            delegate
            {
                // Clean-up action code goes here. The client might not be able 
                // to do this through the IFoo interface because it might not
                // even expose a Dispose method.
                //
                // If you created other hidden dependencies in order to construct
                // Foo, you could also clean them up here. 
                foo.Dispose();
            });
    }
}

et l'importation ailleurs:

[Export(typeof(ISomething))]
public class FooUser : ISomething
{
    private readonly Func<string,int,ExportLifetimeContext<IFoo>> fooFactory;

    [ImportingConstructor]
    public FooUser(Func<string,int,ExportLifetimeContext<IFoo>> fooFactory)
    {
        this.fooFactory = fooFactory;
    }

    public void DoSomething()
    {
        using (var fooLifetime = this.fooFactory("hello", 3))
        {
            IFoo foo = fooLifetime.Value;
            ...
        }
    }
}

Si vous ne vous pouvez pas besoin de l'action de nettoyage puis simplifier considérablement en jetant tous les trucs de ExportLifetimeContext.

Cependant, certaines implémentations de IFoo pourraient être à usage unique (ou dépendent d'autres objets à usage unique) tandis que d'autres ne sont pas. Donc, la chose la plus correcte à faire est de construire un signal « Je suis fait avec cet objet » dans l'abstraction, ce qui est ExportLifetimeContext fournit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top