2013-07-09 19 views
1

我正在使用Prism/Unity編寫WPF應用程序。基於接口的WPF w/Unity負載模塊

我有我的主要應用程序(與引導程序)。

我有我的每個模塊的接口。例如:

MyModuleA工具IMyModuleA

MyModuleB工具IMyModuleB

我想實現鬆散耦合和依賴注入。

所以在我的引導程序中,我想指定基於接口加載庫(類型)。這將允許我獨立構建模塊。

在我的引導程序,我有以下幾點:

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

    string path = @"Modules.MyModuleA.dll"; 
    var assembly = Assembly.LoadFrom(path); 
    var type = assembly.GetType("Modules.MyModuleA.MyModuleA"); 
    ModuleCatalog.AddModule(new ModuleInfo { 
     ModuleName = type.Name, 
     ModuleType = type.AssemblyQualifiedName, 
     Ref = new Uri(path, UriKind.RelativeOrAbsolute).ToString() 
    }); 
} 

這是做的最好的方法是什麼?

回答

0

我必須說這不是最好的辦法,因爲你仍然指定字符串類型更糟,因爲留下空間的人爲錯誤。依賴注入和鬆散耦合是關於使用接口並註冊實現該接口的不同類型的。

如果你想在同一個接口上實時加載不同的模塊,你應該使用你自己的Bootstraper,它在所需的代碼路徑被調用。而它的內部使用:

if(shouldUseEmail)     
Container.RegisterType<IFeedbackService, EmailFeedbackService>(); 
else 
Container.RegisterType<IFeedbackService, SMSFeedbackService>(); 

,後來你解決這樣的:

var feedbackService = Container.Resolve<IFeddbackService>(); 

或使用DI(在構造函數依賴注入)

+0

維達斯,我同意你的看法,這就是我正在努力去做。然而,在你的例子中,我仍然需要在設計時包含一個參考_EmailFeebackService_(或者,在我的情況下,_MyModuleA_) 在我的ConfigureModuleCatalog中,我該怎麼寫: Container.RegisterType ( ); 仍然只添加對_IMyModuleA_的引用? – a11smiles

+0

此外,這不一定是一項服務,而是一個模塊,如果這有所作爲。 – a11smiles

+0

我認爲DI的全部重點是**而不是**必須提供具體的類,只是界面?然後我在運行時簡單地將具體類的DLL添加到項目中。既然它正在實現一個接口,我應該只能調用feedbackService.MyMethod(),它只會調用具體類的方法。 使用上面的方法,我仍然需要添加對具體EmailFeedbackService的引用,這意味着(並糾正我,如果我錯了),當我重新編譯EmailFeedbackService,我需要重新編譯應用程序... – a11smiles