2012-04-02 141 views
1

大氣壓在我的應用我這樣做:負載棱鏡模塊(在啓動時)

class Bootstrapper : UnityBootstrapper 
    { 
     protected override DependencyObject CreateShell() 
     { 
      return Container.Resolve<Shell>(); 
     } 

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

      App.Current.MainWindow = (Window)Shell; 
      App.Current.MainWindow.Show(); 
     }  

     protected override void ConfigureModuleCatalog() 
     {    
      base.ConfigureModuleCatalog(); 
      var moduleCatalog = (ModuleCatalog)ModuleCatalog; 

      moduleCatalog.AddModule(typeof(FooModule)); 
      moduleCatalog.AddModule(typeof(BarModule)); 
     }   
    } 

我想負載FooModule和BarModule通過指示DLL文件的路徑,像這樣的:

protected override void ConfigureModuleCatalog() 
{ 
... 
      var assembly = Assembly.LoadFrom(@"libs\FooLib.dll"); 
      var type = assembly.GetType("FooLib.FooModule"); 
      moduleCatalog.AddModule(type); 
... 
} 

,但它不工作,我得到這個錯誤信息上Bootstrapper.Run():

有銅在ModuleManager中rrently沒有moduleTypeLoader,它可以檢索指定的模塊。

編輯: 這是我FooModule:

public class FooModule : IModule 
    { 
     private readonly IRegionViewRegistry _regionViewRegistry; 

     public FooModule(IRegionViewRegistry registry) 
     { 
      _regionViewRegistry = registry; 
     } 

     public void Initialize() 
     { 
      _regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Main)); 
     } 
    } 

回答

2

好,儘量讓你的ConfigureModuleCatalog看起來像這樣:

protected override void ConfigureModuleCatalog() 
{ 
    string path = @"libs\FooLib.dll"; 
    var assembly = Assembly.LoadFrom(path); 
    var type = assembly.GetType("FooLib.FooModule"); 
    ModuleCatalog.AddModule(new ModuleInfo 
           { 
            ModuleName = type.Name, 
            ModuleType = type.AssemblyQualifiedName, 
            Ref = new Uri(path, UriKind.RelativeOrAbsolute).AbsoluteUri 
           }); 


} 

的關鍵是:Ref財產

Ref = new Uri(path, UriKind.RelativeOrAbsolute).AbsoluteUri  

prism檢查是否指的是物理文件(file://)和負載裝配這個文件。

+0

非常感謝你,它工作! – Omu 2012-04-04 07:44:31

1

我覺得Prism v4 Loading modules on demand with DirectoryModuleCatalog能幫上忙。

更新:
對不起,剛纔意識到上面提到的參考不起作用。
試試這個one from msdn - 「加載模塊按需」部分,我認爲這就是你需要的。

+0

沒有,沒有幫助,這樣一來,他們沒有在所有加載的,或者沒有獲得它要求我猜 – Omu 2012-04-02 10:44:00

+0

你是否檢查過你的'FooModule'和'BarModule'是否可以通過Reflection加載並實例化?只需創建一些最小的測試控制檯應用程序並嘗試檢查它。 – 2012-04-02 11:33:48

+0

你可以檢查[此codeplex上的線程](http://compositewpf.codeplex.com/discussions/58512),也許它可以幫助 – 2012-04-02 11:35:02

0

一個更簡單的方法不是手動輸入路徑,從類型 - >組件 - >位置

Type module1Type = typeof(Module1.Module1); 
    string path = module1Type.Assembly.Location; 
    moduleCatalog.AddModule(
     new ModuleInfo() 
     { 
      ModuleName = module1Type.Name, 
      ModuleType = module1Type.AssemblyQualifiedName, 
      Ref = new Uri(path, UriKind.RelativeOrAbsolute).AbsoluteUri 
     }); 

    return moduleCatalog;