2017-11-25 14 views
2

私は金融システムを持っているため、保存、更新、制御の制限のためのモジュールを設計する必要があります。 各顧客にUserIDがあり、各UserIDに1日あたりの最大クレジット数があることがわかります。たとえば、UserID = 12はMaxAmountPerDay = 10 $CurrentAmountPerDayです。まずどのように計算し、顧客の信用を管理し、それを更新しますか?

は、私はシンプルなモジュールを設計し、次のようにテーブルを定義したい:

User ID | MaxAmountPerDay | CurrentAmountPerDay 
------------------------------------------------- 
    12  | 10    | 0 
    25  | 100    | 84 

今、あなたはユーザーID = 12持つ顧客は、私があれば制御する必要が取引を行っている時に想像することができます取引金額+現在金額>最大金額次に例外をスローするトランザクションを実行して現在の金額を更新する必要があり、更新後に例外が発生した場合、更新操作をロールバックする必要があります(更新とロールバックは異なるデータベーストランザクションにありますロールバックは新しい量の同じアップデートです)

私はこのデザインを行う前に、将来的にお客様の要件が変わると思うので、より良い解決策やオープンソースのフレームワークを探すことに決めました。例えば、MaxAmountPerMonth、今私が知らないより多くの要件。

答えて

0

は、それは本当に問題ではありません。
ユーザートランザクションを有効にするには、一部のデータが必要です。

フレームワークについては、BPMを使用できますが、そのような小さな要件ではオーバーヘッドです。
検証ルールのメンテナンスを改善するために行うことは、それぞれの特定のルールをデカップリングすることです( )。
今日、1つの検証ルールがありますが、将来、ユーザートランザクションを無効にする可能性のある複数のルールを持つことになります。それらを処理するために
、あなたは、単にルールの連鎖を定義することができます。

検証インタフェースに頼る

TransactionRule rulesChain;

public interface TransactionRule{ 
    void valid(UserInformation userInformation) throw ValidationException; 
} 

チェーンの各要素はので、このインタフェースの実装です。
ルールチェーンでvalid()を呼び出すと、最初のルールが適用されます。
ルールがユーザー情報によって尊重される場合、ルールは次のルールに渡されます。
それで... そして、要素がValidationExceptionを投げるとすぐに、それはルールが尊重されていないことを意味するので、妥当性検査は終了し、トランザクションをキャンセルする必要があります。

提案された方法は、責任パターンの連鎖の軽いバージョンと見ることができます。
ルール実行の順序としての「ライト」は、あなたのケースでは重要ではありませんが、このパターンでは一般的に重要です。

0

は、私はあなたがあなたが今欲しいものを達成するのに役立ちます。このrequirement.Itを実装するためにデータベース・トリガーを使用することができると思う

データは、データベーステーブルから、または任意のサポートサービスから来るかもしれ
+0

こんにちは、これは可能な解決策かもしれませんが、あなたの応答に少し詳細があり、トリガーを実装する方法に関連する可能性のあるコードを含めるとよいでしょう。必要な作業コードスニペットで回答を編集してください。 –

+0

ええ!私は次回にやる –

関連する問題