2009-10-26 111 views
0

好的。所以這是我的簡化方案。我們有一個處理大量客戶訂單的系統。我們希望員工能夠查看所有訂單,並且我們希望客戶用戶只能查看與其相關的訂單。如何防止重複業務邏輯?

在試圖查看特定的記錄,我們使我們的OrderSecurity類使用以下功能:

Public Function CanViewOrder(order) 
    If currentUser.MemberOfStaff() Then 
     CanViewOrder = True 
    Else 
     CanViewOrder = (order.ClientId = currentUser.ClientId) 
    End If 
End Function 

在點的時候,我們希望顯示訂單的列表,我們可以下面的函數定義的用戶在一個OrderService類中

Public Function GetOrders() 
    If currentUser.MemberOfStaff() Then 
     GetOrders = GetAllOrders() 
    Else 
     GetOrders = GetAllOrdersForClient(currentUser.ClientId) 
    End If 
End Function 

這對上述情況沒問題,但由於規則變得更復雜,比如說,我們添加另一個用戶類型,它代表了一個不太可信的員工,他只能查看來自客戶子集的訂單。然後,我們不得不邏輯添加到CanViewOrder和GetOrders功能(和潛在的數據訪問類),它在我的腦海違反DRY原則。

所以,我的問題是:我在這裏缺少一個竅門 - 是有一些方法我可以結合業務邏輯進行許可,其中這兩個功能可以使用一個地方查看訂單?

還是我擔心太多,應該控制一下,並有邏輯在兩個地方?

(在這個特定的應用程序,我正在使用ASP經典 - 不恨球員,討厭遊戲 - 但你是如何解決在任何語言中這個問題我很感興趣)

回答

1

IMO你不要在這裏重複自己。在CanViewOrder業務邏輯是不一樣的GetOrders業務邏輯。有一種膚淺的相似之處,這是事實,但這兩條規則在理論上可以有不同的演變。

1

您可以將訪問策略集中並使其更一般化(可能以犧牲效率爲代價),方法是將其保留在您的謂詞中,稍微概括爲考慮主題(用戶)和對象(順序) :

Public Function CanView(user, order) 
    (magic) 
End Function 

然後避免通過實施GetOrders(user)如超過設定的訂單將CanView(user, order)過濾重複的訪問策略。

已經走了這條路線,你可以定義其他的「查詢」,也一勞永逸,獨立政策的方式,以及它如何可能會改變。例如:GetUsersWhoCanView(order)CanViewSameOrders(user1, user2)CanAnybodyView(order) ...

對於只有少數依靠它,「直接的方式」功能的簡單和相對靜態的政策,有據可查,爲您提供最佳效率和最頭痛。如果您的政策可能變得複雜或者可能經常改變,或者將來可能會被許多其他功能使用,那麼使用上面列出的模塊化方法可以避免產生技術債務。