2015年9月30日 星期三

【Design Pattern】三層式 Model 的研究

我現在新加入的 MVC 專案其中一部份是

現在有一個新的需求進來,希望將 Product 中的原料擴充成自己有一組 CRUD 介面但資料庫部分仍都在 Product 表,所以從 Controller 開始要一路擴建類別繼承到 Provider,但在 Factory 層我碰到了問題

在 MaterialFactory 中我要取用 SearchMaterialCollection(...) 則我需要傳入 MaterialProvider 的實體並以它來操作該方法
但是專案切割上 Provider 與 Factory 屬於不同專案,如果要取用到該類別,Factory 會需要 Providr 專案的 dll 並引用,我直覺認為不該這麼做,感覺提高了兩專案的耦合度。

再來我想到的是擴充介面的方法
但實際上這比方法1更不可行,首先 MaterialFactory 中使用 IProductProvider 去操作 SearchMaterialCollection 有邏輯不直觀的問題,更重要的是對 IProductProvider  的修改會造成 ProductProvider 的連鎖修改,這樣就違反了開放封閉原則。

不過這個做法引導我想到了比較理想的做法

那就是使用介面繼承介面的方式實作,由於介面本來就在 Domain 專案集中管理,Factory(屬於 Service 專案)和 Provider 都已具有其 dll 所以不會影響本來的專案分割結構,且 IMaterialProvider 建立後,MaterialFactory 即可直觀的取用它,又因為 IMaterialProvider 是擴充的,MaterialProvider 只需直接實作擴充的部分,也就不會需要改寫 ProductProvider 了。

最後完整結構為

ref: UML 使用 Creately 製作

沒有留言:

張貼留言