標籤:

C#開發中三層架構BLL,DAL還有IBLL和IDAL介面,請問為什麼要定義介面?有什麼用啊?

想了半天,沒弄明白。謝謝解惑,最好舉個具體的例子。再次感謝。想了半天,沒弄明白。謝謝解惑,最好舉個具體的例子。再次感謝。


你想過嗎,建一棟大廈時,怎麼支持這麼多電子設備的接入?

沒關係,咱們甩出一個IChaZuo插座介面,一個IWangKou網口介面

那麼,那些電視機啊冰箱啊,都能放在我的List&裡面,想用時 IChaZuo.Open()就可以

同樣,電腦、手機、網路電視能放在List&,用時可以IWangKou.Connect()

然後,我就可以放膽跟各個廠說:你們怎麼設計木關係,實現了老子的介面就包接入!

這就是解耦的好處了,大廈與電子設備對於對方都是黑盒子,但實現了介面就能閉著眼睛接入。

對於軟體老說同樣如此,只要實現了我的IDAL,管你的數據是來自Mssql、Mysql、串列口、網口、文件、WebAPI……反正我就能拍胸口說都能接入!

如此一來,三層架構中各層的設計都輕鬆了:反正實現了你的介面就好,管你一秒鐘調用1000次還是一百年調用一次,我懶得操這份心。

對於一個大型的系統來說,解耦實在太太太重要了!否則你想想,改一個字母幾十個文件都受到影響,這還讓人怎麼活啊


這是為了讓模塊之間解除耦合,例如某個業務用介面表示了,那麼它的具體實現都是基於這個介面的;在使用中,直接操作介面類型即可,而實際實現介面的對象是根據業務傳遞進來的。(可以看作介面是所有實現的父類,這樣只要傳遞進來的對象是介面的實現,即可通過介面定義的方法對對象進行操作,至於這個對象是誰,不需要關心)

具體舉例來說:汪星人會「汪汪」叫,而喵星人會「喵喵」叫,業務是操縱這些萌物叫,那麼可以定義一個萌物介面,裡面有一個「叫」方法,汪星人和喵星人都實現了「萌物」,而具體是怎麼叫的是由汪星人和喵星人來實現的。業務層調用「叫」的時候只需要讓這邊傳進來一隻萌物,調用萌物的「叫」方法即可,至於這隻萌物到底是什麼,不需要關心,這樣就解開了兩邊的耦合,將來有了新的萌物,只要實現介面然後給業務層傳進來就行了,這邊叫的業務不需要改變任何代碼,因為它得到的是「萌物」的實現。以後所有業務編程都面向介面,即制定了這個介面的規則,那麼業務只管去對這個介面操作就行了,至於它的實現,我不關心,我只管我這邊做好就行了,而做具體的人根據介面規範做好實現就行了,兩邊沒有任何關聯,關聯只是這個制定好的「約定」。這樣就解開了兩邊的耦合。

您看到的這些介面就是制定的這個「約定」,只要操作介面就能根據約定進行操作而不用關心具體操作的是誰。介面這個名字起得很形象,比如USB存儲,不管我的設備是怎麼實現的(磁碟、flash、eMMC、光碟機等)只要我實現了USB介面,我都能通過這個介面存取數據,至於設備是怎麼存取數據的?是什麼原理?我不關心,以後有了更先進的存儲方法,只要我實現了USB介面,以前的設備就能用,這樣就解開了兩邊的耦合;而這個比喻在軟體工程中原理是一樣的。


除了換資料庫基本沒什麼用(當然可以換資料庫這個義意非常重大),你說你分這麼多層,寫的人才不會理你這麼多呢。於是後來覺得只要可換資料庫,單層效果是最好的。


我來舉個具體的例子吧。我們公司業務是Java寫的,相當於bll層。當我們c#通過URL調用的時候就需要知道參數是啥返回值是啥,這種約定就類似於介面。這樣我們可以同時開工完成以後還可以單元測試。達到解耦和隔離的效果。去了解一下依賴倒轉和注入就知道介面的作用和IOC的作用了


介面就是為了解耦合啊,使用介面配合ioc框架實現解耦。


多為了擴展而進行抽象,比如將來要支持多資料庫等等。小項目沒必要


推薦閱讀:

這些書閱讀的先後順序是什麼?
值得看的C#的開源項目有哪些?
有哪些原因會導致HRESULT:0x800704A6提示已經計劃系統關機,除了更新系統或瀏覽器?
吐槽 C#
VS里有什麼Eclipse里沒有的強大功能?

TAG:NET | C# |