2010-12-09 3 views
4

변수가 Lazy으로 선언 된 경우, Value 속성을 사용할 때 해당 생성자가 호출됩니다.게으른 인스턴스를 초기화 할 때 생성자에 매개 변수 전달

Lazy 인스턴스에 일부 매개 변수를 전달해야하지만 올바른 구문을 찾을 수 없습니다. 이것은 내 디자인이 아니며 MEF와 ExportFactory을 사용하고 있는데, 내 부품의 Lazy 인스턴스를 반환합니다. 내 파트에는 생성자가 있으므로 이러한 생성자를 매개 변수로 호출해야합니다.

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

다른 곳에서 가져 :

답변

2

MEF에는 생성자 매개 변수를 ExportFactory로 생성 할 때 생성자 매개 변수를 파트에 전달할 수있는 기본 제공 방법이 없습니다. Wim Coenen이 제안한 것과 같은 것이 아마 당신이 원하는 것을 성취 할 수있는 최선의 방법 일 것입니다.

8

당신은 당신의 자신의 Func 대신을 내보낼 수는 청소 작업이 필요하지 않은 경우

[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

+0

@Wim : 폴더에서 플러그인을로드합니다. Foo foo = new Foo (param1, param2)는 구현시 "Foo"를 알지 못하기 때문에 문제가됩니다. 이것은 ExportFactory와 잘 작동하지만 이제는 플러그인의 한 유형의 ViewModel에 매개 변수를 전달해야합니다. 어떤 제안? – ps23

+0

@PatrickS : IFoo를 직접 구현하는 유형의 어셈블리를 스캔 한 다음 리플렉션을 통해 생성자를 호출 할 수 있다고 생각합니다. MEF가 많은 도움이 될 것이라고 생각하지 않기 때문에 원래 질문의 범위를 벗어나서는 너무 자세히 설명되어 있습니다. –