2013-07-12 20 views
3

考慮具有存儲庫層(持久性),服務層(應用程序)和Web(UI)層的Web應用程序。體系結構:何處放置不依賴於任何其他服務或存儲庫組件的服務類

考慮一個組件(即ExternalProgramExecutor),它不是一個UI組件,也不依賴於服務或存儲庫層中的任何組件。

的問題是:

  • 是否該組件屬於服務層?
  • 該組件是否屬於持久層?
  • 是否應該與這些圖層分開處理?如果是這樣,這部分架構的名稱是什麼?

回答

4

問自己以下問題:

  • 是它堅持的東西嗎?
  • 是否提供服務?
  • 這些事情是否與您的應用程序特別相關?

的回答第一個問題應該是否定的,因爲你已經告訴我們,組件不上鉤以任何方式應用。

第二個問題的答案應該是肯定的,因爲這就是所有優秀的軟件組件提供的:某種服務。但是任何值得其鹽的靈活組件都應該在軟件應用程序的任何地方都能很好地工作,所以真正的問題是這樣的:您應該在哪裏放置組件,以便您的Web架構最忠實地保留下來?

畢竟,Web架構只是一種組織機制。如果您試圖在The One True Web體系結構參考™中找到答案,那麼您的doingitwrong

0

鑑於你的問題的限制,我會問你的獨立組件的目的是什麼?它主要是圍繞某些數據(這會使其成爲持久層的一部分),還是它是應用程序(應用程序層)的域或業務邏輯或工作流程的一部分?像一個外部任務執行器,我會傾向於認爲是你的應用程序層的一部分。

0

從概念上講,'ExternalProgramExecutor'看起來像一個服務,因此它屬於服務層。

走在了服務層的細節,有兩種可能性:

  1. 服務「ExternalProgramExecutor」有本質的其他服務一樣,所以它的服務層的另一「圓點」 ,
  2. 該服務與其他服務有很大不同,它是服務層的另一個「塊」。

這種脫節保持與從更務實點(實現):

  1. 該服務依賴於相同的功能(相同的用戶界面,同樣能夠獲得持久性):它應該與其他集成部分服務層,使用他們的API ...
  2. 該服務本質上是獨立的:這是一個機會,不要創建不必要的依賴關係,獨立開發它。
1

個人而言,我會添加其他問題的問題清單@Robert問:

  1. 它是完全獨立的我的應用程序嗎?

對我來說,我通常會在我的架構中添加一個新的實用程序/框架組件,這是我放置完全獨立的組件的地方,以後可以在其他應用程序中重用。

0

我傾向於將服務視爲您的域模型上的接口,並且因爲聽起來這種關係不存在,所以聽起來並不像這種意義上的服務。

你的持久層調解與你的數據存儲的通信,但是它聽起來像這個組件沒有太多要做。

那麼它屬於哪個層?它真的需要屬於一個嗎?通過問這些問題,聽起來你已經花時間正確地組織你的對象了。如果你有一個多餘的組件,你既可以:

A)拖放到在那裏使用的最

B)拖放到自己組裝和停止擔心誣指:)

0

甲多層(軟件)體系結構使用不同的層,以分配一個應用程序的責任,所以我們有:

  1. 分離的責任。
  2. 易於查看工作流程。
  3. 能夠用最小的努力副作用替換層實現。

從點3,如果改變 「ExternalProgramExecutor」 並不需要對其他層任何變化。我想這本身就值得一層。 我在一個具有類似目的的項目上使用了一個名爲「Ext」的圖層。

如果更改需要任何更改,請將其添加到需要修改的圖層。

希望它有幫助。

1

根據DDD,這樣的服務 - 這似乎是同化爲 「的Util /助手」 服務 - 應該在 「基礎設施層」(SRC:InfoQ

架構

一個典型的企業應用架構由 以下四個概念層的:

  • 用戶界面(表示層):負責向用戶呈現 信息並解釋用戶命令。
  • 應用層:該層協調應用程序活動。它不包含任何業務邏輯 。它不包含業務狀態 對象,但它可以保存應用程序任務進度的狀態。
  • 域圖層:此圖層包含有關業務 域的信息。業務對象的狀態在這裏。 業務對象的持久性和可能的​​狀態將委託給 基礎結構層。
  • 基礎設施層:該層充當所有其他層的 支持庫。它提供通信 層之間,業務對象實現持久性,包含了用戶界面層 支持庫等
0

好,ExternalProgramExecutor是本身就是一個服務,因爲你的應用程序使用的本作一個外部組件。

顯然,如果您不打算將該組件的source code作爲應用程序項目的一部分,那麼您不能將該服務放入您的應用程序中。因此,您實際上將在您的項目中擁有超過該服務/組件的Gateway。爲了使它SOLID,你的網關將是抽象,你的問題是其中你應該引用該抽象網關。

答案完全取決於ExternalProgramExecutor(以及Gateway)提供的功能以及您的項目如何使用該功能。從應用程序的頂層到底層(DAL - > ... - > UI),而抽象功能不是圖層的一部分。找到合適的圖層後,使用該圖層中的網關,底層在運行時不應該知道具體網關的存在。

相關問題