2010-12-09 2 views
4

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

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

ответ

2

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

8

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

+0

Части не полностью доверяют моему делу. Кроме того, так как я понятия не имею (со стороны экспортера), кто вызывает экспортированный Func, поэтому мне нужно, чтобы какой-то идентификатор передавался как параметр функции. Таким образом, часть заявляет, кто он. Это силовое отверстие безопасности, часть которого может претендовать на роль кого-то другого, и я верну секретные данные другой части к этому. Эта проблема может быть решена путем проектирования в момент, когда я создаю объект. В этот момент, используя метаданные, я знаю, какая часть, которую я создаю, и легко вставляю ее конкретные зависимости в свой конструктор. – Xaqron 2010-12-15 09:20:41

Смежные вопросы