ASP.NET WebFormsアプリケーションに最適なアーキテクチャ


10

クライアント用のASP.NET WebFormsポータルを作成しました。プロジェクトは、最初から適切に計画および構造化されているのではなく、ある程度進化しています。その結果、すべてのコードが同じプロジェクト内でレイヤーなしでまとめられます。クライアントは機能に満足しているので、プロジェクトのリリースに自信を持つようにコードをリファクタリングしたいと思います。アーキテクチャの設計にはさまざまな方法があるようですが、最善の方法についていくつかの意見をお願いします。

機能性

ポータルでは、管理者がHTMLテンプレートを構成できます。他の関連する「パートナー」は、IFrameコードをサイトに追加することにより、これらのテンプレートを表示できます。これらのテンプレート内で、顧客は製品を登録および購入できます。APIはWCFを使用して実装されており、外部の企業もシステムとインターフェイスできます。管理者セクションでは、管理者がさまざまな機能を設定し、各パートナーのレポートを表示できます。システムは請求書と電子メール通知を顧客に送信します。

現在のアーキテクチャ

現在、データベースへの読み取り/書き込みにEF4を使用しています。EFオブジェクトは、aspxファイル内で直接使用されます。これにより、サイトを作成している間、迅速な開発が容易になりましたが、dbとUIを密に結合しているため、このように維持することはおそらく受け入れられません。特定のビジネスロジックがEFオブジェクトの部分クラスに追加されました。

質問

リファクタリングの目標は、サイトをスケーラブルで、簡単に保守でき、安全にすることです。

  1. これにはどのようなアーキテクチャが最適ですか?各レイヤーに何があるべきか、DTO / POCO /アクティブレコードパターンを使用する必要があるかどうかなどを説明してください。

  2. DTO / BOを自動生成する強力な方法があるので、追加のレイヤーがあっても、将来の拡張は簡単に実装できますか?

  3. プロジェクトをWebFormsからMVCに変換することは有益でしょうか?


1
早期にリリースし、頻繁にリリースします。提示する具体的なビジネス上の問題がない場合(たとえば、それが安全でない場合)、クライアントはそれほど気にしない可能性があることをお勧めします。おそらく、少しクリーンアップして(移植可能であることを確認して)解放し、長期的な取り組みとしてこれを実行して、MVCまたは同様のものに変更する必要があります。
gahooa

2
特にプロジェクトがそのまま正常に機能している場合は、作業中のプロジェクトテクノロジーを新しいxyzテクノロジーに変更しないでください。動作している場合は、壊さないでください。ビジネスはコードを気にしません。結局のところ、機能性が重要です。
NoChance

確かにそうですが、私の懸念は、リリースされると、賭け金がはるかに高くなると壊れるリスクがあるため、リファクタリングが難しくなることです。そのため、保守性が低く、デバッグが困難なコードなどに悩まされることになります。MVPに習得したり変換したりしようと誘惑されましたが、作業が多すぎるように見えました。これまでのところ、私はそれをDAL、ドメイン、UIレイヤーに変換しました。これは、より整理されているように感じられる一方で、プロジェクトが若いときに必要になる必然的なRADを許可しています。必要に応じて、ある日、MVPまたはMVCに拡張できます。すべてがどのように機能するかを学ぶのに十分な時間があれば。
スタックマン

それでも面倒に感じるのは次のとおりです。1)UIのEFオブジェクト(UIレイヤーのファイルの背後にあるコード)
スタックマン

(2)DALレイヤーに配置する必要があった拡張EFオブジェクトのビジネスロジック(部分クラスが同じアセンブリにある必要があることを認識していませんでした)(3)UIレイヤーのaspx.csファイル内のビジネスロジック。ただし、アーキテクチャに関してはしばしば妥協点があるようですが、これは確かに前進です。これは最初のリリースでは許容できると思います。時間が経つにつれ、アプローチを再評価できます。皆さん、ありがとうございました。この領域は非常に主観的であるため、少し方向を示すのは良いことです。
スタックマン

回答:


5

ASP.NET MVPパターンは、長期の ASP.NET Webフォームアプリケーションに最適なアーキテクチャです。それは、MV *パターンの背後にあるトレンドの事実上の事実である、「懸念の分離」の概念と関係し始めています。

上の質問なぜそれを使用するには?-この投稿で詳細に対処-ASP.NET MVP


問題は、プロジェクトをMVCにリファクタリングするのに多くの作業が必要になることです...もしドメインレイヤー(コードファースト、POCO)、データアクセスレイヤー(dbコンテキストのみ)、UIを備えたWebフォームアプリとしてそれを維持すると、あなたはこれを生産に受け入れられるデザインだと思いますか?後日、それをMVCに変換することを検討できます。
スタックマン、

まあ、それはMVP(model-view-presenter)パターンであり、MVC(model-view-controller)ではありません。
ユスボフ

1
ああごめんなさい-私は誤って読みました。ありがとう-MVPの設計についてお読みします。
スタックマン、

問題ありません。探しているものが見つかるといいのですが:)
Yusubov

MVPへの変換も大きな変更になると思われます。クライアントはすぐにリリースしたいので、上記のアーキテクチャのDAL / DA / UI(MVPほど理想的ではありませんが)がこのタイプのアプリケーションに受け入れられると思いますか?その後、リリース後、v2でのMVPへの移行を検討できます。
スタックマン

1
  1. 個別のロジックとUIにMVPパターンを使用するため、将来的には既存のロジックを再利用して別のUIテクノロジーに移行できます
  2. ビジネスロジックを再利用するRDBSに変更できるように、BLとDALの間でリポジトリパターンを使用します
  3. BOとDALに別々のレイヤー(Dll)を用意して、メンテナンスを最小限に抑えます。

なぜ誰もがこの質問に反対票を投じた理由がわかりません。正直なところ、これが最も簡潔な答えです。+1
グレッグバーガート2016年

0

ElYusubovが述べたように、MVPパターンは素晴らしいものになる可能性があります。

重要な概念は、コードビハインドからロジックのほとんどまたはすべてを取り除くことです。ロジックをページにバインドしないでください。あるページのロジックを別のページで再利用する必要がある場合はどうなりますか?コピー&ペーストしたくなるでしょう。これを行っている場合、プロジェクトは保守可能になります。

そのため、まず、コードビハインドからロジックをリファクタリングし、ビジネスレイヤーに配置します。コードビハインドからすべてのロジックを取得できた場合は、必要なインターフェイスを実装して真のMVPにすることができます。

また、データアクセスがビジネスロジックから分離されていることを確認してください。データレイヤーを作成し、その端でもリファクタリングを開始します。EF4を使用しているので、EFはすでにこのエンドを分離しているはずなので、これはそれほど問題にはなりません。すべてのEFファイルを別のプロジェクトに簡単に移動し、それを必要とするプロジェクトへの参照を追加するだけで済みます。さらに、他のプロジェクトでデータモデルを参照する必要がある場合もあります。

圧倒されないように、少しずつリファクタリングしてください。コードに触れたときは常に、その周りのコードをリファクタリングすることを検討してください。これを行うと、時間の経過とともにプロジェクトがより保守しやすくなる可能性があります。

編集する

背後のコードにビジネスロジッククラスを継承させることについて質問しました。「is-a」ページの背後にあるコードのため、これは実行できません。C#では多重継承が許可されていないため、分離コードクラスをページとカスタムオブジェクトの両方にすることはできません。概念的にロジックを分離する必要があります。おそらく、コードビハインドのコードが多くの異なることをしている場合です。クラスは1つのことだけを行う必要があります。既存の機能を概念的に引き出す方法について考えてみてください。たとえば、登録ページがあり、ユーザー情報を収集しているとします。おそらく、registerというボタンと、そのボタンに関連付けられたクリックイベントがあります。その場合、ユーザー情報を保存し、必要な処理をすべて実行します。そのすべてのロジックを処理するRegistrationオブジェクトを作成できます。

これはより明確な分離であるだけでなく、コードを自己文書化する方法にもなります。誰かがあなたのコードを読むとき、彼らはあなたがRegistrationオブジェクトを呼び出しているのを見るので、あなたは何が起こっているのか正確に知ることができます。

MVPパターンに厳密に従う場合は、パラメーターをRegistrationオブジェクトに渡す代わりに、分離コードがインターフェイスを実装します。インターフェースの実装は、本質的にすべてのビューオブジェクト(テキストフィールドなど)をインターフェースにマップします。例:public string FirstName {get {return txtFirstName.Text; }}

それが完了したら、ページを登録オブジェクトに渡すことができます

Registration.RegisterUser(this);

そして、このRegisterUserメソッドはインターフェースをパラメーターとして受け取ります

public bool RegisterUser(IUser user){user.FirstName ...}

パブリックインターフェイスIUser {パブリック文字列FirstName; }

このMVPが混乱しているように思える場合は、リファクタリングに集中して、コードの再利用を最大化することがすべてのポイントであると理解してください。自分を繰り返すことは、もはやありません。それがDRYプリンシパルです。


役立つヒントをありがとう。はい、私は確かにこれに少し圧倒されています。MVCが使用するのに最適なパターンであるように思えますが、MVPの方が簡単に実現でき、次に最適なパターンになります。私は常にファイルの背後にあるコードを使用してきたため、ビジネスロジックをプレゼンテーションから分離する方法について常に頭を悩ませてきました...したがって、本質的に.aspx.csファイルをドメインレイヤーに移動し、aspxにinheritsステートメントを含めることができるはずです?確かに3つのレイヤーで終わると、最初のバージョンをリリースするのが楽になります-その後、それを改善できます。
スタックマン

私の回答であなたのコメントに返信します。私の答えが役に立ったと思ったら、遠慮なく投票してください
コーダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.