2012-04-02 26 views
2

我們有一個服務公開客戶端使用的所有數據,所有對象都有接口IAuthorized創建更好的方式來根據用戶角色過濾數據

獲取到客戶端的數據需要根據用戶憑據進行過濾。

流程就是這樣的客戶端調用服務 - >服務調用SomeManager類從數據庫中獲取數據...

這裏來了AuthorizationManager來過濾數據...

public class SomeManager 
    { 
     public object[] Foo() 
     { 
      var data = Repository.GetData(); 
      return autorizationManager.Filter(data); 
     } 

     public object[] Foo_Else() 
     { 
      var data = Repository.GetOtherData(); 
      return autorizationManager.Filter(data); 
     } 

    } 

,你可以看到每個方法需要過濾,

所以我問你的是:我們可以建立一個基類,過濾一些每種方法的屬性輸出數據?它很聰明嗎?我們應該像這樣離開嗎?簡單地說,我們稱之爲自動化的方法?

你能想出更好的方法嗎?

一些東西像:

public class EngineManager :BaseFilterAutho 
{ 
    [AuthorizationCollection] 
    public object[] Foo() 
    { 
     var data = Dao.GetData(); 
     return data; //get filtered 
    } 
     [SingleCollection] 
    public object Foo_Else() 
    { 
     var data = Dao.GetOtherData().First(); 
     return data //get filtered 
    } 

} 

回答

1

我已經在那裏的數據是由用戶的授權過濾的一個項目工作。使用的方法與您的「AuthorizationManager」方法類似。這需要編寫大量的過濾代碼,但它工作正常並且易於理解。

還有其他的方法,你的想法當然可以實現。你所指的是使用Aspect Oriented Programming,AOP。這是Java世界中的一種常見方式,在.Net中也是可行的。 PostSharp是一個使這成爲可能的第三方庫。我從來沒有在一個工作項目中使用過PostSharp,但我目前正在使用它來自學AOP。

下面是使用PostSharp實現的一個方面示例,它將更改方法的返回值以過濾返回的數據。這是一個虛擬的方面,我玩PostSharp demo,過濾返回的數據,只返回包含字母「S」的聯繫人。如你所見,這個方面要求返回值是IQueryable。我懷疑你總是需要對返回值的數據類型有一些基本的瞭解,例如如果你正在使用IQueryable,ICollection,數組或其他東西。

[Serializable] 
    public class CollectionFilterAspect : OnMethodBoundaryAspect 
    { 
     public override void OnExit(MethodExecutionArgs args) 
     { 
      base.OnExit(args); 
      IQueryable<Contact> retVal = (IQueryable<Contact>)args.ReturnValue; 
      args.ReturnValue = from r in retVal where r.LastName.Contains("S") select r; 
     } 
    } 

要使用這個方面,你可以用你建議的語法,把一個屬性的方法,表明它應該被過濾。

[CollectionFilterAspect] 
public IQueryable<Contact> GetByName(string value) 

雖然這個簡短的演示說明這肯定是可能的,但它可能是也可能不是一個好主意。我沒有經驗在真實世界的軟件中使用它,所以我無法幫到你。

+0

感謝您的評論,我不喜歡帖子銳利,因爲它的代碼注入。但你的想法'IQueryable'非常好,過濾可以在...中完成。 – guyl 2012-04-04 06:42:19

相關問題