2010-08-02 127 views
1

我在基於PRISM的silverlight應用程序中創建了一些簡單的自定義ModuleManager。我也在bootstrapper中註冊了這種類型,但PRISM仍然使用默認管理器。我的CustomModuleManager的構造函數被調用,但屬性ModuleTypeLoaders永遠不會被訪問。我無法弄清楚,我怎樣才能使它正常工作?如何在PRISM中註冊自定義模塊管理器?

這裏是bootstrapper.cs

protected override void ConfigureContainer() 
    { 
     Container.RegisterType<IShellProvider, Shell>(); 
     Container.RegisterType<IModuleManager, CustomModuleManager>(); 

     base.ConfigureContainer(); 
    } 

CustomModuleManager.cs

public class CustomModuleManager : ModuleManager 
{ 
    IEnumerable<IModuleTypeLoader> _typeLoaders; 

    public CustomModuleManager(IModuleInitializer moduleInitializer, 
           IModuleCatalog moduleCatalog, 
           ILoggerFacade loggerFacade) 
     : base(moduleInitializer, moduleCatalog, loggerFacade) 
    { 
     MessageBox.Show("ctor"); 
    } 

    public override IEnumerable<IModuleTypeLoader> ModuleTypeLoaders 
    { 
     get 
     { 
      MessageBox.Show("getter"); 
      if (_typeLoaders == null) 
      { 
       _typeLoaders = new List<IModuleTypeLoader> 
         { 
         new CustomXapModuleTypeLoader() 
         }; 
      } 

      return _typeLoaders; 
     } 

     set 
     { 
      MessageBox.Show("setter"); 
      _typeLoaders = value; 
     } 
    } 
} 

CustomXapModuleTypeLoader.cs

public class CustomXapModuleTypeLoader : XapModuleTypeLoader 
{ 
    protected override IFileDownloader CreateDownloader() 
    { 
     return new CustomFileDownloader(); 
    } 
} 

CustomFileDownloader.cs

public class CustomFileDownloader : IFileDownloader 
{ 
    public event EventHandler<DownloadCompletedEventArgs> DownloadCompleted; 
    readonly FileDownloader _dler = new FileDownloader(); 

    public CustomFileDownloader() 
    { 
     _dler.DownloadCompleted += DlerDownloadCompleted; 
    } 

    void DlerDownloadCompleted(object sender, DownloadCompletedEventArgs e) 
    { 

     _dler.DownloadCompleted -= DlerDownloadCompleted; 


     if (DownloadCompleted != null) 
     { 
      if (e.Cancelled || e.Error != null) 
      { 
       DownloadCompleted(this, e); 
      } 
      else 
      { 
       DownloadCompleted(this, 
        new DownloadCompletedEventArgs(e.Result, 
        e.Error, 
        e.Cancelled, 
        e.UserState)); 
      } 
     } 
    } 

    public void DownloadAsync(Uri uri, object userToken) 
    { 
     _dler.DownloadAsync(uri, userToken); 
    } 
} 

回答

3

重新排序,以base.ConfigureContainer通話,使你獲得(最後一個勝):

protected override void ConfigureContainer() 
{ 
    base.ConfigureContainer(); 

    Container.RegisterType<IShellProvider, Shell>(); 
    Container.RegisterType<IModuleManager, CustomModuleManager>(); 
} 
相關問題