2016-12-15 39 views
0

我們在.NET和SQL Server中有一個MVC4項目。我們展示了人員列表,從列表中我們可以取消激活用戶,或者點擊編輯,您會看到除非活動標誌(我們在列表中顯示標誌)之外的所有字段。如何在軟刪除時實現可重用性

我的同事創建了一個存儲過程來專門更改用戶的活動標誌,我認爲這從純粹的面向對象的角度來看是不正確的。

我們有一個叫人用Person_SID,名稱,活動類,這是我們在創建時填充或編輯,然後我們把它傳遞給業務層這樣

PersonBusiness.Save(p) 

p的是人的一個實例。我們不應該這樣做激活或停用用戶嗎?

public void SetFlag(int person_sid, bool flag) 
{ 
    Person p = null; 
    if((p = Get(person_sid)) != null)//check if user still exists 
    { 
     p.Active = flag; 
     Save(p); 
    } 
} 

而是具有調用存儲過程來專門做這導致我們現在維護兩個存儲過程和冗餘的方法等的:

repo.SetActive(person_sid, flag); 

謝謝您的時間。

回答

1

對於一系列任務(如你的)有兩個或多個存儲過程是一種完全可行的方法,開發人員的觀點在這裏相當不重要。這裏唯一重要的是業務需求,他們可以證明開發人員認爲次優的許多決定是合理的。

舉一個例子,與普通編輯相比,企業可能希望爲要去(激活)Person的用戶要求額外(單獨)權限。通常情況下,我會創建單獨的角色,並授予他們的權限相應的對象,如:

create role 'manager'; 
go 
create role 'supervisor'; 
go 
grant execute on dbo.person_Edit to [manager]; 
go 
grant execute on dbo.person_Activate to [supervisor]; 
go 

當然,你可以在你的代碼添加等效檢查,如:

if is_rolemember('supervisor') = 0 and @Active != @OldActive 
    throw 'Membership in the "supervisor" role is required to deactivate a person.'; 

然而,這樣的解決方案會帶來許多其他問題 - 您不能使用內置的SQL Server安全系統來設置權限,因爲該檢查現在位於您的代碼中。如果業務規則稍後發生變化,DBA不能簡單地調整權限,他必須更改過程的代碼。如果由於某種原因,這樣的需求在數據庫實例中有所不同......那麼您就明白了。

簡而言之,諮詢企業是否需要這種訪問分離或其他可能從中受益的內容,如果他們不這樣做,請將其用作擺脫其他過程的參數。否則,現有解決方案可能會更好地保持不變。

+0

非常感謝您的回答! – Alex