2009-11-06 23 views
1

我被要求編寫一個應用程序,該應用程序將充當許多其他外部應用程序的控制器。它將作爲計劃任務運行,其目的是處理它在特定位置找到的任何新文件,並根據文件類型調用外部處理程序來處理它們。C#:應用程序之間的解耦通信

控制器應用程序必須等到處理程序應用程序完成後再調用下一個應用程序,並且還需要知道它是否成功。

有一個額外的複雜因素,其中一些文件可能是軟件包,並且軟件包的目的可能是更新控制器應用程序本身。出於這個原因,我使用的任何框架都必須考慮到這一點。

基本上我只是在這裏尋找一些設計靈感,試圖找出控制器和處理程序之間的解耦通信的強大方法。

回答

2

我認爲你有兩個完全不同的問題:

  1. 控制器/處理器通信
  2. 就地控制器的軟件更新

會如果你可以更詳細地描述這些處理程序的外觀,這會有所幫助。他們的.NET程序集是否具有實現處理程序接口的類?如果它那樣,那麼我幾乎建議使用MEF來定位和加載處理程序並執行它們。 MEF可能會使這些處理程序的位置和加載更容易。

自更新應用程序總是有些棘手。我已經解決了這個問題的一種方法是有一個兩部分的應用程序。第一部分是一個小引導程序應用程序,它只知道如何啓動控制器。從本質上講,找到控制器應用程序並啓動它是啓動程序的工作。我這樣做的方式是爲我已經部署的每個新版應用程序提供一個包含一個子目錄的目錄。引導程序只是選擇最高版本並啓動它在該目錄中找到的控制器應用程序。

樣品控制器目錄結構:

\Programs 
    \Controller 
     bootstrapper.exe 
     \v1.0 
      controller.exe 
     \v1.1 <-- Current version 
      controller.exe 

當更新被應用,發生是一個新的「版本」目錄在控制器目錄中創建和更新返回一個代碼到控制器,用於指定其需要重新啓動。一旦控制器完成它的工作,它就會退出。由於整個過程是由引導程序啓動的(引導程序在啓動控制器時會阻止它),因此引導程序在控制器啓動時重新獲得控制權。引導程序再次執行它的啓動過程,找到新的控制器版本並啓動它。

這裏的一個問題是更新引導程序並不容易,但通常這不會因爲它包含很少的代碼而經常更新。

希望能夠幫助或激發一些想法。

+0

處理程序不存在,但它看起來很可能這些將是獨立的應用程序。我們不負責編寫所有的處理程序,因此決定是爲了簡化。 Bootstrap建議是一個有趣的建議,尤其是版本文件夾的使用,它絕對值得考慮,謝謝。 – Andrew

0

您可以嘗試使用NServiceBus作爲控制器和處理程序之間的消息傳遞系統。這聽起來像是一個非常簡單的場景,但控制器會向特定處理程序發送消息,然後等待響應。根據響應,它將另一個消息發送給另一個處理程序,依此類推。

不知道你如何做遠程更新。

0

您可以這麼想: 作爲Windows服務託管的WCF服務中的工作流程。您可以根據您的要求決定是否需要順序或狀態工作流程。我希望this會幫助你更好地理解它

相關問題