Передайте параметры конструктору при инициализации отложенного экземпляра - PullRequest
4 голосов
/ 09 декабря 2010

Как я знаю, если переменная объявлена ​​Lazy, то ее конструктор вызывается, когда мы используем свойство Value.

Мне нужно передать некоторые параметры этому экземпляру Lazy, но не могу найтиправильный синтаксис.Это не мой дизайн, я использую MEF и ExportFactory, он возвращает мне Lazy экземпляров моих частей.У моих частей есть конструкторы, и мне нужно вызывать эти конструкторы с некоторыми параметрами.

Ответы [ 2 ]

8 голосов
/ 09 декабря 2010

Вы можете экспортировать свой собственный Func вместо:

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();
            });
    }
}

и импортируйте его в другое место:

[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;
            ...
        }
    }
}

Если вам не нужно очищающее действие, вы можете значительно упростить это, выбрасывая все ExportLifetimeContext.

Однако некоторые реализации IFoo могут быть одноразовыми (или зависеть от других одноразовых предметов), а другие - нет. Поэтому самое правильное, что нужно сделать, - это встроить сигнал «Я закончил с этим объектом» в абстракцию, что и обеспечивает ExportLifetimeContext.

2 голосов
/ 09 декабря 2010

MEF не имеет встроенного способа передачи параметров конструктора в деталь, когда вы создаете его с помощью ExportFactory. Что-то вроде того, что предлагает Вим Коенен, вероятно, лучший способ достичь того, чего вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...