2016-11-27 58 views
0

我正在設計一個使用Prism模式的複合WPF/MVVM應用程序。我已閱讀WPF的Developer's Guide to Microsoft Prism Library 5.0,並且我熟悉所描述的大多數模式。C# - Prism for WPF - 通用模塊的庫升級策略

我的應用程序的模塊將包含許多二進制文件(DLL-S)的,其中一些將包括實施的事件聚合和服務共享庫,它將定義公共接口到MVVM模型,事件類通過該模塊。其他模塊將能夠引用這樣一個庫,並通過公共接口和IoC與其模型,事件和服務一起工作。

比方說ModuleA.Shared共享庫包括其的SampleModelSampleService,這與的SampleModel執行工作的一個公共接口:

namespace ModuleA.Shared 
{ 
    interface ISampleModel 
    { 
     int SampleProp01 { get; set; } 
     int SampleProp02 { get; set; } 
    } 

    interface ISampleService 
    { 
     ISampleModel GetSampleModelInstance(); 
     void SaveSampleModelInstance(ISampleModel obj); 
    } 
} 

現在說ModuleB(在非共享二進制)使用ModuleA的公共圖書館:

namespace ModuleB.Engine 
{ 
    class SampleClass 
    { 
     void SampleMethod() 
     { 
      ModuleA.Shared.ISampleService srvc = SomeIoCContainer.Resolve<ModuleA.Shared.ISampleService>(); 
      ModuleA.Shared.ISampleModel obj = srvc.GetSampleModelInstance(); 

      // Do some work on obj... 

      srvc.SaveSampleModelInstance(obj); 
     } 
    } 
} 

好了,現在讓我們說ModuleB開發和利用第三方(如第三方插件)編程和維持。在某個時間點我添加一個新的屬性,以ModuleA.Shared.ISampleModel

namespace ModuleA.Shared 
{ 
    interface ISampleModel 
    { 
     int SampleProp01 { get; set; } 
     int SampleProp02 { get; set; } 
     int NewProp { get; set; } // <-- New property 
    } 

    /* ... */ 
} 

最終用戶升級我的應用程序,所以老ModuleA的可執行文件已經被新的所取代。 ModuleB由第三方分發,其二進制文件保持不變。

由於ModuleAModuleB正與不同版本的編譯ModuleA.Shared.ISampleModel,我認爲國際奧委會解決將不會成功,應用程序將在一個異常結束。

我在問什麼是解決此類問題的良好實踐/模式?如何讓一些模塊升級而不破壞對依賴它們的第三方模塊的支持,並且使用它們的共享庫的舊版本進行構建?

回答

1

這與您是否使用棱鏡完全無關。你正在提供一個插件API(通過使用棱鏡的模塊解構),你必須計劃版本化你的api。

首先,一旦api的一個版本被釋放,它就會被凍結。你永遠無法觸及它(除非你希望你的第三方重新編譯所有東西,使他們和你的客戶不高興,至少可以說)。

而不是改變的API,發佈它的新版本:

interface ISampleModelV1 
{ 
    int SampleProp01 { get; set; } 
    int SampleProp02 { get; set; } 
} 

成爲

interface ISampleModelV2 
{ 
    int SampleProp01 { get; set; } 
    int SampleProp02 { get; set; } 
    int NewProp { get; set; } // <-- New property 
} 

那麼第三方可以決定是繼續使用ISampleModelV1或切換到ISampleModelV2如果他們需要NewProp。當然,你的應用將不得不支持他們兩個。

由於隨着api版本數量的增加,遲早會變得醜陋,您可能希望廢棄舊版本,例如,如果你的應用從2.5到3.0,你可以取消對api 1.x的支持......儘管如此,一定要儘早將這些決定傳達給客戶和第三方。

BTW:

挑戰棱鏡沒有解決 [...]應用版本

+0

一個很好的回答,非常感謝你!您所描述的解決方案將運行良好。出於好奇 - 您是否知道複合應用程序體系結構的任何其他版本控制策略? –

+0

不是真的,最終這是一個問題,您需要多長時間提供一個新API,以及您需要多長時間才能支持舊的api版本。產品管理必須與任何支付開發費用的人討論 – Haukinger