0

たとえば、指定されたIDで注文をキャンセルするメソッドを備えたWCFサービスがあります。このメソッドは、サイトのすべてのユーザーが Web から呼び出すことができます。

このメソッド内のどこかで、指定された ID を持つ注文が現在ログインしているユーザーに属していることを確認する必要があります (認証 Cookie を読み取ります)。

このチェックをどこで実行するのが良いですか?

WCF メソッドでは、ビジネス プロセスを開始し、その内部のどこかで、ID で注文を読み込むようにリポジトリに要求します。

このような Web へのオープン操作を多数行うことができます。そして、私はそのような所有権チェックを忘れる可能性をできるだけ低くしたいと思っています - 私はそのようなチェックを、すべてのコードブランチが行く狭い場所に実装したいと思っています.

私はそのようなチェックをリポジトリで行うことができますが、この種の検証はリポジトリの責任であると確信しています. また、動作属性をサービスまたはその操作に適用することで、ある種の宣言型検証を実装することもできますが、所有権を実行するときに最初に少なくとも 2 回オーダーをロードする必要があるため、これが適切な場所かどうかはわかりません。テストし、ビジネスプロセスで。

4

1 に答える 1

1

すべてのサービスには、セキュリティ境界としての責任があります。したがって、サービス メソッドは、必要なビジネス ロジックを呼び出す前に、入力パラメーターの検証呼び出しを実行する必要があります。それに加えて、常に早く失敗する必要があります。とにかくメソッド呼び出しが失敗する場合は、できるだけ早く失敗するようにしてください ( http://en.wikipedia.org/wiki/Fail-fastも参照してください)。

そのため、サービス メソッドで検証メソッドを呼び出す (サービス メソッドごとに 1 つの検証クラスを記述する) と、そのメソッドは、アクションが許可されていない場合に検証例外をスローするか、ステータス コードを返すことができます。例外は、実行を停止し、コール スタックに強制的に作用させるため、一般的に好まれます。

検証方法がどのように機能するかは別の問題です。リポジトリを呼び出して、トランザクションの所有者を尋ねる場合があります。どのように実装しても、動作はバリデータ クラス内に隠されています。

于 2012-11-15T12:14:55.247 に答える