2016-11-18 6 views
1

エンティティフレームワークを使用して、私は許可と呼ばれるエンティティを持っています。これは、実行可能と不可能を指定するためのboolのセットです。強く型付けされたパラメータにC#の名前?

少しのように:

public class Permissions 
{ 
    public int Id {get;set;} 
    public int GroupId {get;set;} 
    public bool ViewRecords {get;set;} 
    public bool EditRecords {get;set;} 
    public bool DeleteRecords {get;set;} 
    public bool CreateRecords {get;set;} 
    public bool CreateSubGroups {get;set;} 
} 

あなたがアイデアを得ます。各ユーザーグループにはこれらの1つがあり、それはすべて良いことです。

私は、この情報を適切なグループとアクションに対して検証してチェックするセキュリティサービスクラスを用意しています。すべてうまくいきますが、避けたいマジック文字列が残っています。例えば

として私が好きなpublic bool HasPermission(int groupId, string action)public bool HasPermission(int groupId, Permission action)現時点で

、私は、nameofを使用しています:、マッピングする方法は、しかし

bool go = HasPermission(123, nameof(Permission.ViewRecords)); 

ありクラスプロパティは次のようになります。

bool go = HasPermission(123, Permission.ViewRecords); 

私は列挙型でそれを行うことができ、お互いを鏡映するように2つを維持することができますが、それは避けたいオーバーヘッドです - 名前が機能している間は、メソッドは任意の文字列を受け取ることができ、ラインを下ろす。

+1

なぜ列挙型を使用しないのですか?これはあまりオーバーヘッドではなく、誰かが未知の魔法の文字列をラインの下に通すことで壊れてしまうのを防ぎます。 –

+1

列挙型のもう1つの利点は、フラグ列挙型にして、簡単に複数のアクセス許可をチェックできることです。 – Servy

+0

@StephenWilsonそれは私が尋ねるところです。大規模なオーバーヘッドではありませんが、私は、(必ず)新しい権限が後で行の下に追加されるときに必要な変更の数を最小限にしようとします。今、完全に正当な答えはそれだけです - 「いいえ、enumは良いことです(tm)」。 @Servyの 'flags'(私にとっては新しいもの)については、' Enum'がより魅力的になります! – RemarkLima

答えて

7

このように:

if (GetPermission(123).ViewRecords) { ... } 
+0

ありがとう、これはかなり良い方法に見えます - 少しリファクタリングする必要があるので試してみましょう。機能の一部としてチェックされるいくつかの次元があります。ユーザーグループと組織ですグループの行列を作成することができますが、それは疑問を抱かせるでしょう! – RemarkLima

+0

質問のコメントによると、私は他のメリットのために 'enum'を使いました。さらに、モデルはユーザーが複数のグループに属していることを意味します。どのグループからでも...しかし、これは質問に対する素晴らしい答えであり、より簡単なアクセス許可モデルを見るための素晴らしい方法です! – RemarkLima

1

これは私のコードではありませんが、どこから取得したのかはわかりません。

public bool HasPermission(int groupId, Expression<Func<T>> propertySelector) 
{ 
    if (propertyExpresssion == null) 
    { 
     throw new ArgumentNullException("propertyExpresssion"); 
    } 

    var memberExpression = propertyExpresssion.Body as MemberExpression; 
    if (memberExpression == null) 
    { 
     throw new ArgumentException("The expression is not a member access expression.", "propertyExpresssion"); 
    } 

    var property = memberExpression.Member as PropertyInfo; 
    if (property == null) 
    { 
     throw new ArgumentException("The member access expression does not access a property.", "propertyExpresssion"); 
    } 

    var getMethod = property.GetGetMethod(true); 
    if (getMethod.IsStatic) 
    { 
     throw new ArgumentException("The referenced property is a static property.", "propertyExpresssion"); 
    } 

    var name = memberExpression.Member.Name; 
} 

あなたがでそれを呼び出すことができます。

Permissions GetPermission(int groupId) { ... } 

し、それを使用します。私は単純に(あなたはまだしていない場合)メソッドGetPermissionを作成したい

bool go = HasPermission(123,() => Permission.ViewRecords); 
+0

これは単にnameof(...)を書いている長い方法です。なぜC#言語で書かれているものを書き換えるのですか?これは、C#のバージョン5またはそれ以前のバージョンでは問題ありません。 Miguel CastroはPluralsightコースでこのコードを使用したと思います。 –

+0

これはnameof()の直接書き換えではありません。彼はメソッドにプロパティを与える方法を望んでおり、プロパティの周りにはnameof()を書かない。そしてあなたが述べたように、それは古いバージョンでも機能します。 – Rabban

関連する問題