Передавайте параметры конструктору при инициализации отложенного экземпляра

StackOverflow https://stackoverflow.com/questions/4396744

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

Вы могли бы экспортировать свой собственный 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 обеспечивает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top