2016-06-21 17 views
-3

UIを使用して複雑な要件を開発することが可能な状況があります。具体的には、ユーザーが資格に基づいて特定の作業を実行する権限をユーザーに与えることです。c#複雑なルールを処理する

たとえば、ユーザーは、

  1. これらのすべて: Qual1、Qual2、Qual3
    • OR(次のいずれか:(Qual4、Qual5)これらのすべて: Qual11、Qual12、Qual13 )
    • これらの1つ以上: Qual6、Qual7、Qual8
    • 、これらの一つ:私は仕様のパターンを見て持っていた

Qual9、Qual10これが問題の最良の解決策であるかどうかはわかりません。

各ロールの要件は、資格テーブルにリンクされた承認テーブルと資格テーブルにリンクされたトレーニングテーブルを介してユーザーのトレーニングを使用してデータベースに格納されます。

+0

これはかなり明らかです。彼らはあなたが指定した資格を持っているかどうかをチェックしたいだけです。あなたは技術を何も指定していないので、私はそれを打ち砕いた。私たちはWebAPIを話していますか? –

答えて

1

コードでこのようなルールを表すのは簡単です。まず、あなたはそれをあまりにも複雑にしています。 「そして」と「すべて」は単に「すべて」であり、「1つ以上」と「または」はどちらも「すべて」です。だから、ほんの数述語が必要になります。

abstract class Requirement 
{ 
    abstract public bool Satisfied(User user); 
} 
sealed class Qual1 : Requirement { ... } 
sealed class Qual2 : Requirement { ... } 
... 
sealed class All : Requirement 
{ 
    private IEnumerable<Requirement> r; 
    public All(params Requirement[] r) { this.r = r; } 
    public All(IEnumerable<Requirement> r) { this.r = r; } 
    public override bool Satisfied(User user) { 
    return r.All(x => x.Satisfied(user)); 
    } 
} 
sealed class Any : Requirement 
{ 
    .... 

だから今はちょうど言っている:

var q1 = new Qual1(); 
... etc ... 
var rule = All(
       Any(
       All(q1, q2, q3), 
       All(
        Any(q4, q5), 
        All(q11, q12, q13))), 
       All(
       Any(q6, q7, q8), 
       Any(q9, q10))); 

をそして今、あなたが言うことができます。

if (rule(user)) ... 

簡単peasyを。

+0

@Ericに感謝しますが、ユーザーがUIを使って条件を構築するときにルールをハードコーディングできません。コード内の条件を動的に解析するにはどうすればよいでしょうか? – Ray

+0

@レイ:だから、どのように違うのですか?あなたにはオブジェクトがあります。あなたはオブジェクトを操作するUIを持っています。ユーザーからアクションを取り込んでオブジェクトを作成するUIを作成します。 **これはUIが何をしているか**。 –

関連する問題