2011-09-24 57 views
0

我需要幫助將以下類用於我正在開發的程序中。原來是IdeaBlade演示程序"PRISM EXPLORER",基於Unity。我需要幫助將一部分從UNITY轉換爲MEF。我處理了其他一切。只是停留在這一個。我已經用MEF「[EXPORT(typeof(XXX))]」標記了我的課程,我想我需要以某種方式使用「ComposeExportedValue」。令人困惑的部分是找到這條線的等值線:需要幫助將PRISM Unity Module Init轉換爲PRISM MEF模塊初始化

var provider = 
    (IEntityManagerProvider) _container.Resolve<IPersistenceGateway>(); 
    _container.RegisterInstance<IEntityManagerProvider>(provider); 

謝謝!

以下是我需要轉換的整個班級。你可以在這裏找到原文:Ideablade PRISM Page

using Microsoft.Practices.Composite.Modularity; 
using Microsoft.Practices.Composite.Regions; 
using Microsoft.Practices.Unity; 
using PrismExplorer.Infrastructure; 
namespace ModelExplorer.Explorer { 
    public class ExplorerModule : IModule { 

    private readonly IUnityContainer _container; 

    public ExplorerModule(IUnityContainer container) { 
     _container = container; 
    } 

    public void Initialize() { 
     InitializeContainer(); 
     SetViews(); 
    } 

    // ToDo: Consider getting from configuration 
    private void InitializeContainer() { 
     RegisterGatewayAndEntityManagerProvider(); 

     _container.RegisterType<IQueryRepository, QueryRepository>(
     new ContainerControlledLifetimeManager()); // singleton 
    } 

    private void RegisterGatewayAndEntityManagerProvider() { 
     _container.RegisterType<IPersistenceGateway, PrismExplorerPersistenceGateway>(
     new ContainerControlledLifetimeManager()); // singleton 

     var provider = 
     (IEntityManagerProvider) _container.Resolve<IPersistenceGateway>(); 
     _container.RegisterInstance<IEntityManagerProvider>(provider); 
    } 

    private void SetViews() { 
     var regionManager = _container.Resolve<IRegionManager>(); 

     var view = _container.Resolve<ExplorerView>(); 
     regionManager.AddToRegion(RegionNames.MainRegion, view); 

     regionManager.RegisterViewWithRegion(RegionNames.MainRegion, typeof(ExplorerView)); 
    } 


    // Destructor strictly to demonstrate when module is GC'd 
    //~MevModule() { 
    // System.Console.WriteLine("Goodbye, MevModule"); 
    //} 

    } 
} 

回答

0

CompositionContainer對應的兩個方法是ComposeExportedValue<T>(...),它允許你到一個特定的實例添加到容器中,並GetExportedValue<T>(...)從容器獲得的T一個實例。

如果您可以通過減少服務位置的方式來設計您的類型,並嘗試並更喜歡構造函數注入,它將使您的代碼更易於維護和測試。例如,您的代碼可以轉換爲:

[Export(typeof(IModule))] 
public class ExplorerModule : IModule 
{ 
    [ImportingConstructor] 
    public ExplorerModule(IPersistenceGateway gateway) 
    { 

    } 
}