2009-09-18 31 views
0

我正在尋找實現一些LINQ to SQL,但我很難看到我們將如何添加訪問控制業務規則,如客戶只能查看他們的訂單。 在ado.net數據服務,查詢intercptors做的正是我所追求的,並可以看到如何檢查更新/插入/刪除,但有這樣的一個等價的:LINQ到SQL查詢攔截器

[QueryInterceptor("Orders")] 
public IQueryable<Orders> OnQueryOrders(IQueryable<Orders> orderQuery) 
{ 

     return from o in orderQuery 
     where o.Customers.ContactName == HttpContext.Current.User.Identity.Name 
     select o; 
} 

還是願買電子健康我需要通過沿着線存取控制: GetOrdersByCustomer(字符串客戶ID)

+0

就我個人而言,我發現像GetOrdersByCustomer之類的東西更容易理解和維護。攔截器在這裏感覺不必要的複雜性。想想下一個必須維護你的代碼的人,他可能不像你那麼聰明。 –

+0

這對於簡單的場景來說可能很好,但是我希望允許更豐富的查詢構建,所以很快就會有超過100個訪問器,這反過來會讓混淆/錯誤proe /噩夢維護或重構。儘管攔截器可能會引起混淆,但它們確實可以讓關鍵代碼擔憂一致地運行 - 但是認爲賈斯汀的想法更接近我們最終會得到的結果 – steve

回答

0

我認爲,在這種情況下,最好的解決辦法是建立一個真正的業務層應用層和你的LINQ to SQL類之間坐鎮。

然後,您可以查詢您的業務層,從而實現所有業務邏輯和過濾。如果架構正確,那麼對於編碼應用層的任何人來說,該業務層都可以相當透明,然後每個人都會很高興。

+0

嗨Justin 是的,這看起來像我將不得不採取的路線。 我的方法看起來像︰ 使我的dataContext密封,但我的數據對象公開(即在LINQ到SQL的表) 公開從BL的方法,可以在謂詞功能,然後將被添加到表達式樹業務安全邏輯。在我的原型中,這是起作用的,雖然最初有點令人困惑,但所暴露的內容非常清晰但靈活。 – steve

+0

根據應用程序的範圍和性質,創建整個BL可能不實際。 LINQ to SQL能夠獨立處理業務規則驗證。您可以使用部分類來「攔截」數據操作,以達到與ADO.NET查詢攔截器類似的目標。看看這篇文章:http://msdn.microsoft.com/en-us/library/bb882671.aspx – Antony