私はここSOを含めて多くの研究を行ってきましたが、明確な方向性を見つけることができないようです。現在、リポジトリの上にサービスレイヤーを配置したASP.NETMVC3アプリケーションがあります。
私のサービスレイヤーには、次のような機能があります。
public class MyService{
public void CreateDebitRequest(int userId, int cardId, decimal Amount, .... )
{
//perform some sort of validation on parameters, save to database
}
public void CreateCreditRequest(.....)
}
//perform some sort of validation on parameters, save to database
}
public void CreateBatchFile()
{
//construct a file using a semi-complex process which could fail
//write the file to the server, which could fail
}
public PaymentTransaction ChargePaymentCard(int paymentCardId, decimal amount)
{
//validate customer is eligible for amount, call 3rd party payments api call,
//...save to database, other potential failures, etc.
}
}
パラメータの検証はそれほど例外的ではないため、例外をスローすることはあまり適切ではないと人々が言うのを見てきました。また、文字列などの出力パラメータを渡して、空の値をチェックするというアイデアも好きではありません。ValidationDictionaryクラスを実装し、それを任意のサービスクラスのプロパティにすることを検討しました(IsValidブール値とエラーメッセージのリストが含まれ、サービスレイヤーで特定の関数呼び出しの後にチェックして方法を確認できます)物事は行きました)。特定の関数を実行した後、ValidationDictionaryのステータスを確認できます。
var svc = new MyService();
svc.CreateBatchFile();
if (svc.ValidationDictionary.IsValid)
//proceed
else
//display values from svc.ValidationDictionary.Messages...
これについて私が気に入らないのは、古い値を保持しないように、サービスレイヤーの関数呼び出しごとに更新する必要があることです(多くの関数またはほとんどの関数に使用しないことを選択した場合でも、それを期待できます)任意の関数を実行した後、意味のある値またはnull値を持つようにします)。私が検討したもう1つのことは、詳細な検証情報が含まれている可能性のある関数呼び出しごとにValidationDictionaryを渡すことですが、その後、outパラメーターの使用に戻ります...
何かお勧めはありますか?私はこれを行うためのきれいな方法を理解できないようです。関数に対してnullを返すだけで十分な情報である場合もありますが、呼び出し元にもう少し検証情報を返したい場合もあります。アドバイスをいただければ幸いです。
編集して明確にする: 私のサービスレイヤーは、それを消費しているのがMVCアプリケーションであることを認識していません。サービスレイヤーには、CreateBatchFile()やAddDebitRequest()などの特定のパブリック関数があります。コンシューマー(この場合はコントローラーですが、他の何かである可能性があります)が何が起こったのかを知るには、nullを返すだけで十分な場合もあります。また、コンシューマーがサービスレイヤーからさらに情報を求めている場合もあります(コンシューマーがコントローラー)。これをサービスレイヤー自体からバブルするにはどうすればよいですか?