非常にスケーラブルで動的な「ルールベース」のアプリケーションですか?


8

大規模なエンタープライズアプリの場合、変更に対応できることがデザインの最も重要な側面の1つであることは誰もが知っています。ビジネスロジックの変化に対応するために、多くの場合、ルールベースのアプローチを使用しており、各ルールはDBに格納されています。これにより、厄介な詳細に飛び込むことなく、簡単に変更を加えることができます。C#はEval( "foo(bar);")を実行できないため、これは行に格納されたフォーマットされた文字列を使用して実行され、実行時にJavaScriptで処理されます。これは正常に機能しますが、エレガントではなく、レガシーになると、他の人が手に入れるのが最も楽しいものではありません。

これに対するよりエレガントな解決策はありますか?かなり頻繁に変更される何千ものルールに遭遇すると、それは本当のことになりますが、これは、誰かがこれを行うためのより良い方法を考えていない問題の珍しいことではありません。助言がありますか?この現在の方法は防御可能ですか?代替案は何ですか?

編集:明確にするために、これは大規模なエンタープライズアプリであるため、どのソリューションが機能しても、ルールとデータ(約10)を常に維持している人はたくさんいます。また、データは頻繁に変更されるため、ある種の集中サーバーシステムは基本的に必須であると言えます。


2
私はこれの結果を見るのを恐れています...
TheLQ 2010年

C# ReflectionとCompilerServicesを通じて評価できることは注目に値します。
ディアハンター

回答:


12

プログラマー以外がビジネスルールを開発するために使用できる抽象化を作成しようとしている場合は、WFまたはDroolsを使用します。ただし、WFの抽象化がソリューションの開発にかかる時間に値しないほどプログラマーを扱っている場合、私はあなたの投資の付加価値を見ることはできません。

データベースは、大幅に変更される可能性のあるルールを維持するための良い方法ですが、可能な代替案(必ずしもより良いわけではありませんが、代替案)を提案させてください。

1)ビジネスロジックを独自のレイヤー(dll)に分離します-いくつかのインターフェイス(戦略とオブザーバーのパターンを見てください)、つまりIRuleEvaluator.Evaluate(string myParams)で呼び出す方法を抽象化します。

2)これで、各ルール(必要な場合)および付随する単体テストに対して個別のクラスを作成できます。

3)次に、Piècede resistanceのために、IOCコンテナー内のすべての舞台裏を接続します。dllとルールエバリュエーターインスタンス自体です。このようにして、ルールエバリュエーターは実行時の構成を介して構築されます-一緒にハードコーディングされているものはありません。

このアプローチは非常に動的です(一部のテイストでは動的すぎる可能性があります)。これにより、すべてのルールに対して実際の個別のユニットテストを実行できます。ルールを再デプロイまたは変更する必要がある場合は、コアコードを変更せずに、新しいDLLを削除し、IOC構成ファイルを変更して、再起動して確認します。または、何か問題がある場合は変更をロールバックします。データベース)。また、データベースとは異なり、ロジックとアプリケーションコードを1つにまとめるのではなく、半分をC#で記述し、残りの半分をSQLで記述します。


1

私が見たルールには2つのケースがあります。ほとんどの場合、ルール自体は非常に不安定ではありません(ほとんど固定されています)が、決定が行われるデータはビジネスユーザーが変更できます。この場合、データベースから参照データを読み取ることで各ルールをカプセル化する単純な設計パターンで通常は十分です。次に、ルール参照データを変更するためのフロントエンドを提供します。

ルールロジック自体を動的に変更できるその他の場合。1つのアプローチは、IronPythonまたは他の動的言語(.Net 4内)を使用してルールを実装し、実行時に動的にロードすることです。プログラマーがルールを変更する必要があるため、これは妥協です。

ビジネスユーザーがルールを編集可能にしたい場合は、ビジネスドメイン用のDSLを作成することをお勧めします。しかし、これは複雑な作業です。

最後に、ワークフローまたはBizTalkを使用すると、ルールが変換/オーケストレーションパターンに適合する場合に役立ちます。


1

ルールがビジネスから頻繁に変更される高度にスケーラブルな「ルールベースの」アプリケーションを設計している場合は、次のような市場をリードするBRMS製品を検討してください。1. IBM WODM 2. FICO BLAZE Advisor 3. Drools(オープンソース)

私は、BRMSアプローチを使用して大規模な商用アプリケーションに取り組んできました。BRMSアプローチにより、スケーラビリティが高く、保守が容易になり、生産までのダウンタイムがゼロで非常に柔軟になります。それはビジネスを幸せにします。:)


0

私はあなたがクライアント側の操作に厳密に言及しておらず、c#について言及して以来.Netにいると想定しています...

フレームワーク4を使用している場合、DLR(動的言語ランタイム)を使用しているか、SQLにルールを格納している場合は任意のフレームワークを使用してルールをそこで処理したり、> 3フレームワークで動的linqを使用したり、さまざまな関数を記述したりできます。実行時にアセンブリロードを介して名前でロードできるアセンブリとして。

それらのすべてが多くの場合エレガントではありませんが、私はそれらすべてを時々使用しなければなりませんでした。


0

頭に浮かぶのは、Windows Workflow Foundationです。これはASP.NETと一緒に使用できますが、サーバー側で実行されます(そのため、あなたがしていることには適用できない場合があります)。Javaランドには、サーバー側でも実行されるjBPM(ビジネスプロセス管理)があります。

これらのソリューションはおそらくあなたのための法案に合わないので、行う最善のことはそれらのビジネスルールをプレーンな古いコードで実装し(javascript、C#、または仕事に最適なものを使用)、プログラミングコードが設計変更が発生した場合は更新する必要があります。オブジェクト指向の設計パターンを使用すると、コードを簡単に拡張できます。コードをうまく書けば、将来それを変更するのに必要な労力は最小限に抑えられます。


実際、これは非常に大規模なエンタープライズアプリケーションであり、WFは確かに可能性があります。
Morgan Herlocker、2010

0

ルールがすべてフォームの場合

if <condition>
then <action>
[else <action]

Drools.NETまたはiLogなどの別のRete実装を使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.