チェック ロジックを実装するには、次の 2 つの一般的なタイプがあります。
ライブラリを共有します。例は「RIA サービス + Silverlight」です。
プラス:実装が簡単。
短所:相互運用性がない (.NET のみ)。ライブラリが変更されるたびにクライアントの更新が必要です。
サービス部分に共通のメソッド検証を実装します。
長所:相互運用性、チェック ロジックが変更された場合にクライアントを更新する必要がない
マイナス:それはあなただけにあるため、複雑になる可能性があります
SOA を使用する場合は、.NET がどこにでもある会社でのみアプリケーションを使用していない場合に限り、2 番目の選択肢を使用することをお勧めします。
例
一般的な例を考えてみましょう。windows/wpf フォームがあります。また、string 型の「surname」と int 型の「age」の 2 つのフィールドがあります。そして「保存」ボタン。クライアント側でいくつかのチェックを実装する必要があります
1) 一部のユーザーでは、[保存] ボタンが無効になっています。
2) 姓を空にすることはできず、最大長は 256 です。
3) age は 0 未満にはできません。
保存するメソッドの呼び出しは
void Save(string surname, int age);
サービスに 2 番目のメソッドを作成します。このメソッドは、検証情報を含む PermissonAnswerDTO のオブジェクト タイプを返します。
PermissonAnswerDTO SaveValidate(string surname, int age);
および主な検証方法
// If arguments are wrong
[FaultContract(typeof(NotSupportedException))]
// If the user have permisson to invoke this method
[FaultContract(typeof(CustomNotEnoughPermission))]
PermissonAnswerDTO Validate(string methodName, object[] methodParams);
検証。
Validate("SaveValidate", null)
ウィンドウの読み込み時に呼び出します。タイプ CustomNotEnoughPermission の例外がスローされた場合、「保存」ボタンをブロックします。
ユーザーが保存できる場合は、ユーザーのデータを呼び出しますValidate("SaveValidate", object[2]{"Surname", "-60"};
。-60 は有効ではないため、タイプ PermissonAnswerDTO の回答オブジェクトを次の情報とともに取得します。
ParameterName: "age",
ExceptionMessage: "age cannot be less then null".
そして、この情報をユーザーに適切に表示できます。
これについての私の考えは、いつの日か Microsoft がこれを実装し、いつものように新しいテクノロジを呼び出すだろうということです。ほとんどの場合、Microsoft のテクノロジは宣伝されているほど革新的ではありません。例としては、Windows Identity Foundation と Reactive Extensions があります。
完全な例
[DataContract]
public class ParameterExceptionExplanaitonDTO
{
[DataMember]
public string ParameterName;
[DataMember]
public string ExceptionMessage;
}
[DataContract]
public class PermissonAnswerDTO
{
[DataMember]
public bool IsValid;
[DataMember]
public ParameterExceptionExplanaitonDTO[] ParameterExceptions;
}
public class Service1 : WcfContracts.IService1
{
// If arguments are wrong
[FaultContract(typeof(NotSupportedException))]
// If the user have permisson to invoke this method
[FaultContract(typeof(CustomNotEnoughPermission))]
public PermissonAnswerDTO Validate(string methodName, object[] methodParams)
{
//1) Using Reflection find the method with name = <methodName + Validate>
//2) Using Reflection cast each object in "object[] methodParams" to the required type
//3) Invoke method
}
private PermissonAnswerDTO GetUserNameValidate(int id)
{
//logic to check param
}
public string GetUserName(int id)
{
// if the user calls method we need validate parameter
GetUserNameValidate(id);
//some logic to retreive name
}
}