2012-04-02 8 views
2

クライアントが使用するすべてのデータを公開するサービスがあり、オブジェクトのすべてがIAuthorizedというインタフェースを持っています。ユーザロールに基づいてデータをフィルタリングするより良い方法を作成します。

クライアントに送信されるデータは、ユーザーの資格情報に基づいてフィルタリングする必要があります。

流れは、クライアントがサービスを呼び出すことのようである - >サービスは

...データベースからデータを取得しSomeManagerクラスを呼び出し、ここで認可マネージャ・は

...データをフィルタリングするために来ます

あなたは、各メソッドは、フィルタリングする必要が見ることができるよう

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; 
     } 
    } 

このアスペクトを使用するには、提案された構文を使用して、メソッドにフィルタを適用する必要があることを示す属性を設定します。

この短いデモでは、確かにこれが可能であることがわかりますが、それは良い考えかもしれません。私は実世界のソフトウェアでこれを使用している経験がないので、私はそこにあなたを助けることはできません。

+0

あなたのコメントをありがとう、私はそのコード注入のために鋭いポストが好きではありません。しかし、あなたのアイデア 'IQueryable'は非常に良いです、フィルタリングで行うことができます... – guyl

関連する問題