我希望有人可以幫助澄清我的選項,從ASP.NET webforms頁面的代碼隱藏重構方法。作爲背景,最近我們花了一段時間在泛型和非泛型意義上實現存儲庫模式,這使得我們能夠將大量的DAL方法移出代碼隱藏,這非常棒。重構Large Codebehinds - 存儲庫模式和擴展方法
我正在努力完成的是一種將應用程序邏輯方法從代碼隱藏中移出的明智方法,該方法專門關注存儲庫/ DAL以及如何最好地構建BL類。
這裏是我正在考慮在目前兩個選項:
1.創建每代碼隱藏,並從該業務邏輯類,揭露像getProject(int id)
方法這將在幕後, 訪問repo.GetById(int id)
存儲庫實例
據我可以看到會是以下的這個好處:
- 單獨的應用從codebehinds邏輯,讓他們到b Ë簡單
- 允許在BLL可測試方法(有一些調整),一種已經在MVC控制器類的代名詞(這仍然是儘管WebForms的)
- 不公開庫直接
缺點將是:
- 很多在BLL包裝方法不真正做任何 除了隱藏庫的方法
2.在我的實體類型上寫入擴展方法,例如Project.getUsers()
它將訪問一個存儲庫實例方法,允許在不需要特定BLL類的情況下存儲BL,從而減少每個BL類中的包裝方法的重複。
這樣做的好處是:
- 沒有必要有一個BL因爲如此,存儲與他們的實體類型的方法
- 少的包裝方法,因爲不會有需要
ProjectBL.getUsers(projectid)
和UserBL.getUsers(projectid)
這都調用repo.getProjectUsers(projectid)
幕後,簡單Project.getUsers()
來自codebehinds
這種方法的缺點,只要我可以告訴:
- 如果我將來會引入新的類型,例如'SubProject'
getUsers()
需要重新加載 - 我並不太熱衷於擴展方法的一般情況,不確定這是否正確使用它們!
我有點不確定哪個是'更好'的做法,或者我錯過了更好的選擇。值得一提的是,知識庫最初是在代碼隱藏中實例化並直接訪問的,但據我所知,這並不理想,因爲我們冒着從存儲庫中返回IQueryable之類的東西的風險,並且使得可以在代碼隱藏中操作的DAL方法產生不一致的結果。
我覺得就像你說的,這就是我的標題,但我關心的是,確保BLL不說讓每一個代碼隱藏類BLL重複的工作,需要超過重新impliment方法和所有這一切都簡單地包裝DAL的功能。 在這樣的實現中,你將如何構造BLL類?說我有一個Users.aspx,Projects.aspx和Admin.aspx頁面爲例,你會想到一個UsersBL.cs類從代碼隱藏實例化?與所有的'用戶'BL方法,調用DAL方法?和Projects.aspx頁面的單獨BL類? – dougajmcdonald 2012-01-05 20:23:12
通常我會鼓勵使用集中的Repository,並使用一個單獨的前門進行持久性Save(),它可以接受任何您想要保留的域類或DTO。 ORM在這種情況下是無價的。如果現有設計無法實現,請嘗試從控制器注入各種「保存」,「驗證」和其他基於BL的方法到代碼隱藏中。至於如何精確構造它,我無法具體說明,但是嘗試在控制器或代碼隱藏層中構建繼承層次結構,這將允許您將常見代碼移動到基類。 – KeithS 2012-01-06 21:34:07