2010-07-08 5 views
1

와 내가 MEF에서 초보자 해요 그래서 나는 질문이 :) 난 다음 한 :MEF 게으른 ImportMany는 Creationpolicy.NonShared

[PartCreationPolicy(CreationPolicy.Shared)] 
[Export(typeof(SharedExport))] 
public class SharedExport : INPCBase 
{ 
    [ImportMany(typeof(INonShared),RequiredCreationPolicy = CreationPolicy.NonShared)] 
    private IEnumerable<Lazy<INonShared,Dictionary<string,object>>> fac; 

    ... 

    public void Open() 
    { 
     foreach (var lazy in fac) 
     { 
      this.Muster.Add(lazy.Value); 
     } 

    } 

가져온 클래스는 모든 비공유로 표시.

[PartCreationPolicy(CreationPolicy.NonShared)] 
[Export(typeof(INonShared))] 
[ExportMetadata("Muster","030")] 
public sealed class NonShared1 : INPCBase, INonShared 
{ 
    public NonShared1() 
    { 
     Debug.WriteLine("ctor NonShared1" + this.GetHashCode().ToString()); 
    } 

    #region Implementation of INonShared 

    public string Displayname 
    { 
     get { return "Muster 030 "+ this.GetHashCode().ToString(); 
     } 
    } 

    #endregion 
} 

지금 내 질문 : Open()이 실행될 때 항상 새로운 NonShared1 인스턴스를 생성해서는 안됩니까? 나는 항상 똑같아.

답변

9

Matthew는 공유/비공유 측면에 대해서만 각 가져 오기에서 주어진 인스턴스에만 영향을 미치며 Lazy.Value를 가져올 때마다 새 인스턴스를 가져 오지 않습니다. 원하는 경우 매번 새 인스턴스를 가져 와서 처분하면 ExportFactory를 사용할 수 있습니다. 현재 ExportFactory는 MEF의 Silverlight 버전에만 존재하지만 실제로이 기능이 필요한 경우 MEF의 데스크톱 버전에 기능을 추가하는 mef.codeplex.com의 샘플 프로젝트가 있습니다.

+0

ExportFactory 힌트의 경우 thx입니다. 나는 그것을 시도 줄 것이다 :) – blindmeis

3

아니요, Lazy <> 인스턴스 때문입니다. Lazy<T>은 값을 지연로드하도록 설계되었습니다. 이 값은 처음으로 .Value 속성에 액세스 할 때 만들어지며 이후에는 해당 속성에 대한 모든 액세스에 대해 동일한 인스턴스가 반환됩니다. NonShared/Shared 작성 정책은 속성 삽입, 생성자 주입, 필드 주입 등을 통해 가져 오기 프로세스를 수행합니다. GetExportedValue

+0

감사합니다. 그래서 CompositionContainer.ReleaseExport (lazy)가 작동하지 않았습니까? 모두 내가 원하는 것은 게으른 인스턴스를 처리하는 것입니다. – blindmeis