這個問題不讓我睡覺,因爲一年以來,我試圖找到一個解決方案,但是...在我的腦海中仍然沒有發生任何事情。可能你可以幫助我,因爲我認爲這是一個非常普遍的問題。n層應用程序中的實體框架 - 懶惰加載與急切加載模式
我有一個n層應用程序:表示層,業務邏輯層,模型層。假設爲了簡單起見,我的應用程序在表示層中包含允許用戶搜索客戶的表單。現在用戶通過用戶界面填充過濾器並點擊一個按鈕。發生某些事情並且請求到達表示層,如CustomerSearch(CustomerFilter myFilter)
。這個業務邏輯層現在保持簡單:在模型上創建一個查詢並獲取結果。
現在的問題是:您如何面對加載數據的問題?我的意思是業務邏輯層不知道那個特定的方法會被這個表單調用。所以我認爲它不知道請求表單是否只需要客戶對象或客戶對象與鏈接的訂單實體。
我試圖更好地解釋: 我們的表單只是想列出按姓氏搜索的客戶。它與訂單無關。因此,業務邏輯查詢將如下所示:
(from c in ctx.CustomerSet
where c.Name.Contains(strQry) select c).ToList();
現在這個工作正常。兩天後,您的老闆會要求您添加一張表單,讓您可以像查找其他客戶一樣搜索客戶,並且需要顯示每位客戶創建的訂單總數。現在我想重複使用該查詢並添加附加的邏輯(包括)訂單並返回。
你會如何面對這一要求?
這是我從現在開始的最好的(我認爲)的想法。我想聽聽您的意見: 在BLL我CustomerSearch方法不直接創建查詢,但通過該構成的ObjectQuery像私有擴展方法:
private ObjectQuery<Customer> SearchCustomers(this ObjectQuery<Customer> qry, CustomerFilter myFilter)
和
private ObjectQuery<Customer> IncludeOrders(this ObjectQuery<Customer> qry)
但這並不能說服我,因爲它看起來太複雜了。
感謝, 馬爾科
感謝您的非常非常快速的答案。所以你認爲這是一個在演示層而不是業務實體中使用DTO的情況? 謝謝 Marco – Marconline 2010-04-10 00:02:28
聽起來好像您的應用程序正在接近它值得的大小/複雜性點。在轉向DTO時總是有一個權衡,因爲它們總體上增加了複雜性,但像Automapper這樣的工具可以減少它變得有價值的點。 – 2010-04-10 00:36:49
感謝您的建議。我會絕對檢查DTO和Automapper。再次感謝你。 – Marconline 2010-04-10 09:07:51