2011-03-01 2 views
2

내가 설정 한 컨테이너 : Prism4 MEF에서 클래스의 인스턴스를 어떻게 만듭니 까?

public class MyBootstrapper : MefBootstrapper 
{ 
    protected override void ConfigureAggregateCatalog() 
    { 
     AggregateCatalog.Catalogs.Add(xxx.Assembly)); 
// other assemblies 
    } 

    protected override void InitializeShell() 
    { 
     base.InitializeShell(); 
     Application.Current.MainWindow = (MainWindow)Shell; 
     Application.Current.MainWindow.Show(); 
    } 

    protected override DependencyObject CreateShell() 
    { 
     return Container.GetExportedValue<MainWindow>(); 
    } 
} 

가 어떻게 모듈 내 타입 T의 인스턴스를 만들 수 있습니까? 유형 T는 MEF에 의해 구성된 어셈블리의 어딘가에 정의됩니다.

var myType = XXXX.Resolve<T>(); 

UPD1 :

는이 같은 몇 가지가 필요합니다. 인 MyModule

[ModuleExport(typeof(CatalogModule))] 
public class CatalogModule : IModule 
{ 
    private readonly IEventAggregator _event; 
    private readonly IUIManager _uiManager; 

    [ImportingConstructor] 
    public CatalogModule(IEventAggregator @event, IUIManager uiManager) 
    { 
     _event = @event; 
     _uiManager = uiManager; 
    } 

    private void Foo() 
    { 
     var vm = **How create instance of desired type here?** 
    } 
} 

답변

3

당신은 같은 방법으로 당신이 CreateShell 방법 재정에 MainWindow의 인스턴스를 가지고 그렇게. 당신이해야 할 일은 Container.GetExportedValue<T>()으로 전화하면 인스턴스를 직접 얻을 수 있습니다. 그러나 유형을 주입하려는 경우 결합이 느슨한 경우 생성자와 [ImportingConstructor] 속성이 해당 유형 (또는 선호하는 경우 인터페이스) 또는 해당 유형의 속성 인 [Import] 속성을 가지고 있어야합니다. .

[Export] 특성을 사용하여 클래스를 꾸미고 유형을 내 보낸 다음 어셈블리가 AggregateCatalog에 추가되었는지 확인하십시오.

희망 사항 :

+0

예. Buh 어떻게하면 'Container'를 얻을 수 있습니까? 모듈에서 나는 그것에 대해 아무것도 모른다. – Lari13

+0

모듈은'CompositionContainer' 타입의 MEF 컨테이너에 의존하게 할 수 있습니다 ('ImportingConstructor'에 추가). 부트 스트 래퍼에 컨테이너 인스턴스를 등록해야합니다. ('Container.ComposeExportedValue (Container);). 컨테이너가 생성자에 삽입되고 모든 내보내기를 액세스 할 수 있습니다.) – AbdouMoumen

+0

감사합니다. 지금 나는 그것을 얻었다 :) – Lari13