也許這是一個太寬泛的問題,但我仍然想聽聽什麼是最佳實踐和什麼被認爲是「正確的」。我沒有找到類似的話題,可能是因爲它的通用性,因此很難搜索。我應該在'main'方法中編碼?
這一切都是在我們開始使用Windows服務項目並向其添加其他服務時開始的。以前,主要方法是我們認爲組合根,我們的IoC容器註冊碼,app.config閱讀和類似的主要方法是以這種或那種形式。在組裝所需的依賴關係之後,我們通過調用容器上的Resolve
並運行它來創建服務。
當我們創建了另一個繼承自ServiceBase
的類時,我們注意到將main作爲組合根已不再有意義,因爲多個服務可能完全不同,因此需要不同的初始化代碼。
我在mather上發現的唯一啓發性帖子是this one from Mark Seemann,他聲稱OnStart
是聚合根(在這種情況下)。
一般來說,選擇合適的組合根時最好採取什麼方法?我是否應該將這種Windows服務場景視爲一個異常情況,只是對其進行不同的編碼,而將其他項目類型的主要方法作爲組合根源,還是存在一種在所有情況下都可用的更一般的方法?
也許事實上,服務需要非常不同的設置是一個指標,他們應該分離在多個獨立的項目,其中主將再次用作組成的根?
我們通常使用.Net,但這可能也適用於許多其他編程語言。
那麼你的建議是在哪裏放置初始化代碼?例如容器設置,日誌配置。可能爲此創建一個小樣本? – julealgon
取決於。在你的情況下,我會寫一個方法(稱爲'Init()'或類似的),並從'Main()'調用這個方法。然後,我會有一個'Run()'方法(它基本上是一個等待發生的無限循環),最後是一個方法'CleanUp()'。主然後會讀取'{Init();跑();清理(); }「。 –
請注意,我描述的情況有兩個獨立的服務。如果我按照你的建議進行操作,我會將它們連接到單個初始化方法中,並且我不能在它們之間設置任何優先級:假設我在同一個進程中有兩個服務,第二個依賴於第一個運行。如果我使用程序類作爲組合根,就像你建議我無法正確初始化第二個服務,因爲第一個服務已經不能運行了。 – julealgon