2010-08-02 12 views
1

J'ai créé un moduleManager personnalisé simple dans mon application Silverlight basée sur PRISM. J'ai également enregistré ce type dans bootstrapper, mais PRISM utilise toujours le gestionnaire par défaut. Le constructeur de mon CustomModuleManager est appelé, mais la propriété ModuleTypeLoaders n'est jamais accessible. Je ne peux pas le comprendre, comment puis-je le faire fonctionner correctement?Comment enregistrer un gestionnaire de module personnalisé dans PRISM?

Voici 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); 
    } 
} 

Répondre

3

ReOrder votre appel à base.ConfigureContainer de telle sorte que le vôtre gagne (dernier gagne):

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

    Container.RegisterType<IShellProvider, Shell>(); 
    Container.RegisterType<IModuleManager, CustomModuleManager>(); 
}