現在、UIからASP.Netアプリを作成しています。私はWinformsにうんざりしていて、関心の分離がより優れたものが欲しかったので、MVPアーキテクチャを実装しています。
したがって、MVPを使用すると、プレゼンターはビューによって発生したイベントを処理します。ユーザーの作成に対処するために私が用意しているコードは次のとおりです。
public class CreateMemberPresenter
{
private ICreateMemberView view;
private IMemberTasks tasks;
public CreateMemberPresenter(ICreateMemberView view)
: this(view, new StubMemberTasks())
{
}
public CreateMemberPresenter(ICreateMemberView view, IMemberTasks tasks)
{
this.view = view;
this.tasks = tasks;
HookupEventHandlersTo(view);
}
private void HookupEventHandlersTo(ICreateMemberView view)
{
view.CreateMember += delegate { CreateMember(); };
}
private void CreateMember()
{
if (!view.IsValid)
return;
try
{
int newUserId;
tasks.CreateMember(view.NewMember, out newUserId);
view.NewUserCode = newUserId;
view.Notify(new NotificationDTO() { Type = NotificationType.Success });
}
catch(Exception e)
{
this.LogA().Message(string.Format("Error Creating User: {0}", e.Message));
view.Notify(new NotificationDTO() { Type = NotificationType.Failure, Message = "There was an error creating a new member" });
}
}
}
組み込みの.Net検証コントロールを使用してメインフォームの検証を実行しましたが、データがサービスレイヤーの基準を十分に満たしていることを確認する必要があります。
次のサービスレイヤーメッセージが表示されるとしましょう。
- メールアカウントは既に存在します(失敗)
- 入力した参照ユーザーが存在しません(失敗)
- パスワードの長さがデータストアの許容長を超えています(失敗)
- メンバーが正常に作成されました(成功)
また、UIが予測できないより多くのルールがサービスレイヤーに含まれるとしましょう。
現在、計画どおりに進まなかった場合、サービスレイヤーに例外をスローさせています。それは十分な戦略ですか?このコードはあなたたちに臭いがしますか?このようなサービスレイヤーを作成した場合、このように使用するプレゼンターを作成する必要があることに悩まされますか?リターンコードは古すぎるように思われ、ブール値は十分な情報を提供しません。
OPではなく編集:OPによって回答として投稿されたフォローアップコメントにマージ
Cheekysoft、ServiceLayerExceptionの概念が好きです。予期しない例外のためのグローバル例外モジュールがすでにあります。これらすべてのカスタム例外を面倒にすると思いますか?基本の例外クラスをキャッチするのは少し臭いと思っていましたが、そこからどのように進行するのか正確にはわかりませんでした。
tgmdbm、ラムダ式の巧妙な使用が好きです!
フォローアップしてくれたCheekysoftに感謝します。したがって、例外が処理されない場合にユーザーに別のページ(私は主にWeb開発者)が表示されることを気にしないのであれば、それが戦略になると思います。
ただし、ユーザーがエラーの原因となったデータを送信したのと同じビューでエラーメッセージを返したい場合は、プレゼンターで例外をキャッチする必要がありますか?
PresenterがServiceLayerExceptionを処理したときのCreateUserViewは次のようになります。
この種のエラーの場合は、同じビューに報告すると便利です。
とにかく、私たちは今、私の最初の質問の範囲を超えていると思います。あなたが投稿したものをいじってみます。さらに詳細が必要な場合は、新しい質問を投稿します。