2009-03-03 84 views
1

我開始我的網站,像stackoverflow,有一點技術債務,我試圖還清。作爲一個合同開發,我已經在很多地方,看到實現這一結果的許多不同的方法,但我要去的方式是..n-tier體系結構反饋需要

演示(網絡)

業務層(老式實體類和BL層)

數據層(通過存儲過程DA類到SQL Server)

我的問題主要涉及的業務層。現在我有一個Entity名稱空間和一個BusinessLogic名稱空間。

BL有對DA和實體的引用。 實體具有對DA 參考(DA正的BL或實體的「不知道」)

我真的希望我將數據轉化爲實體的BL內發生的所有攪動 - 這樣的業務邏輯。但是,我希望實體能夠根據需要訪問BL,從而刪除實體對DL的引用。

所以......

難道又是「錯誤的」具有相同的命名空間內的BL和實體對象,使他們能夠協同工作?

從本質上講,我想有一個像員工實體對象(典型的例子,是吧?),並有員工有返回到該員工報告其它Employee對象的Hashtable一個

public Hashtable[] SubordinateEmployees 

財產。但我不想在需要之前加載它。因此,對於大多數員工來說,財產永遠不會被訪問,但是當它發生時,它會自動加載調用DA的BL。

這個問題有意義嗎?

如果是這樣,我的解決方案嗎?

非常感謝!

回答

2

通常的方法來處理你的例子代表的情況是與外牆。與其試圖從Employee對象獲得下屬僱員,不如使用對業務邏輯的調用來獲取它。

hashtable = BL.GetSubordinateEmployees(supervisor); 

你有機會獲得下屬的一個點,只有一個事物(BL)訪問數據層和創建實體的方式。

+0

我對此的關注是,我希望它們都捆綁在一起成爲一個單一的對象。這允許遞歸等,如果需要的話。就像上下瀏覽組織結構圖一樣。否則,我要麼維護兩個對象,要麼讓我的代碼獲取,然後將散列表存儲到可寫的道具中。 – klkitchens 2009-03-03 19:16:10

+0

你可以這樣做,但你會交換遞歸帶來更高程度耦合的便利。現在你的Entity對象侵入了BL的角色,而不是僅僅依賴於BL。這將使事情在未來變得更難。這是一種折衷。 – Welbog 2009-03-03 19:21:08

2

讓我看看,如果我可以告訴你一個更好的方式去思考,你有你的數據訪問(SQL服務器,MySQL,平整的xml文件等)這個

所有這一切都應該被抽象掉閒來無事在你的應用程序中應該關心或知道你是如何得到你的數據的,只有它的劑量,如果有其他任何人知道你是如何得到你的數據,你有層違反。如果DAL服用其他任何東西,然後獲取數據,則會導致圖層違規。接下來,實現業務層使用的類似IDAL的數據訪問接口,這對於通過強制您分離圖層來使代碼可測試非常重要。

您的數據實體可以放置在DAL名稱空間中或給予它們自己的屬性,給予它們自己的力量分離。數據實體是愚蠢的對象,應該包含很少或沒有邏輯,只知道他們自己和他們擁有的數據,他們不包含業務邏輯!,數據訪問本地或UI邏輯。如果他們確實有層違規。數據實體的唯一功能是保存數據並從一層傳遞到下一層。

Biz層實現了一個數據訪問接口,就像我們之前談到的IDAL,然後您可以使用工廠,IOC容器或所有其他所有失敗的具體類型來實例化此類數據訪問接口,但添加setter屬性以便可以更改此測試用於測試。商業層只處理業務邏輯,它不知道或關心數據來自哪裏或去哪裏,它只關心操縱數據以符合業務規則,這包括日期驗證,過濾(部分是告訴DAL它需要什麼數據,讓DAL弄清楚如何得到它)。 BIZ基本上處理所有與UI相關或與數據檢索無關的邏輯。就像DAL一樣,Biz也應該出於同樣的原因實現接口。

UI層以與Biz層訪問DAL相同的方式訪問Biz層,原因相同。所有的用戶界面層都關心顯示數據並從用戶那裏獲取數據。 IU層不應該知道有關業務規則的任何信息,可能除了填充數據實體所需的數據驗證外。

這種架構的優點是它強制分離問題,使測試更容易,更靈活,更容易維護。今天,你正在建立一個網站,但明天你想讓其他人能夠集成一個Web服務,所有你需要做的就是創建一個實現IBIZ接口和完成的Web服務,當你必須修復BIZ中的錯誤時層,它已經在你的網站和網絡服務中得到了修復。

考慮到這一點,可以說你正在進行大量繁重的數據處理工作,並且你需要更強大的服務器來處理這個問題,所以你所要做的就是實現一個IDal和IBIZ接口,它們真的是WCF的包裝器處理您的服務器之間的通信,現在您的應用程序分佈在多個服務器之間,並且您不必更改代碼即可執行此操作。