2010-03-17 6 views
3

저는 Silverlight 4 RC의 응용 프로그램에서 작업 중이며 플러그인 제어를 처리하기 위해 MEF를 배우기 위해 oppertunity를 사용하고 있습니다. 나는 꽤 기본적인 장원으로 일하고있다. 그러나 그것은 깔끔하지는 않다. 여러 xap을 가져 오는 더 좋은 방법이 있다는 것을 나는 안다.MEF + SL4 질문

기본적으로 내 호스트 응용 프로그램의 App.xaml에, 나는로드 다음 이야기 MEF있어 내 XAP의 :

AggregateCatalog catalog = new AggregateCatalog(); 

DeploymentCatalog c1 = new DeploymentCatalog(new Uri("TestPlugInA.xap", UriKind.Relative)); 
DeploymentCatalog c2 = new DeploymentCatalog(new Uri("TestPlugInB.xap", UriKind.Relative)); 

catalog.Catalogs.Add(c1); 
catalog.Catalogs.Add(c2); 

CompositionHost.Initialize(catalog); 

c1.DownloadAsync(); 
c2.DownloadAsync(); 

내가 완전히 여기에 AggregateCatalog를 사용하지 않는 확신과 나는 디렉토리에있을 수있는 xap을로드 할 수 있어야합니다. 단지 Uri의 코드를 하드 코딩하는 것이 아닙니다 ....

또한, 호스트의 MainPage.xaml.cs에 다음과 같은 컬렉션이 있습니다. 플러그인의 내용은 다음과 같습니다.

[ImportMany(AllowRecomposition = true)] 
public ObservableCollection<IPlugInApp> PlugIns { get; set; } 

다시

마지막으로, MainPage.xaml.cs를 파일 IPartImportsSatisfiedNotification를 구현하고 나는 플러그인의 한 번로드 처리하기 위해 다음과 같은 한 ....이 작동하지만, 내가 잘못 ImportMany을 사용하고 확신합니다 :

public void OnImportsSatisfied() 
{ 
    sp.Children.Clear(); 

    foreach (IPlugInApp plugIn in PlugIns) 
    { 
     if (plugIn != null) 
      sp.Children.Add(plugIn.GetUserControl()); 
    } 
} 

이 방법은 효과가 있지만, n 번 (n은 xap을로드하는 횟수)으로 실행됩니다. 다음과 같이 나는이 플러그인의 나의 스택 패널을로드 할 때 내가 채워집니다하지 않는 것처럼 sp.Children.Clear()를 호출 할 필요 해요 :

TestPlugIn TestPlugIn TestPlugIn B

나는 분명히 여기에 뭔가 빠져있다. 아무도 내가해야 할 일을 지적 할 수 있습니까? 감사합니다.

답변

1

나는 당신이하고있는 일의 대부분이 훌륭하다고 생각합니다. ObservableCollections가 추가되거나 제거되는 개별 요소에 대한 알림을 지원하지만 MEF는이를 이용하지 않습니다. 귀하의 경우에는 단순히 컬렉션을 지우고 모든 플러그인을 추가합니다. 변경 알림을 위해 OnImportsSatisfied를 사용하고 있기 때문에 ObservableCollection이 필요하지 않습니다. 가져 오기에 IEnumerable을 사용할 수 있습니다.

다른 xaps를 다운로드 할 때 유연성을 추가하려면 컨테이너에서 가져올 수있는 서비스를 노출하고 URL이 지정된 xap을 다운로드하는 기능을 제공합니다. 그런 다음 컨테이너의 모든 구성 요소가 다운로드를 트리거 할 수 있으며 적절한 URL로 다운로드 URL을 제공 할 수 있습니다.

+0

고마워, 그게 내가 함께 간 것과 내 요구에 맞는 것 같다. –