2012-05-13 9 views
1

私のウェブサイトの設定ページを作成しました。このページには、ユーザーが操作できるサイトワイドの設定が多数表示されます。私はそれを作ったので、ユーザーが設定を選択すると、ページは自動的にajaxリクエストを実行して設定をデータベースに送信します。私の質問は私がこれをやる方法です。MVC 3 /デザインパターンの問題

私はちょうどリポジトリを呼び出しました。 1回の呼び出しでデータを取得し、それをViewModelに入れ、そのViewModelをViewに渡します.Ajaxコントローラは設定をデータベースに送り返しました。この方法は、必要に応じて偽のリポジトリに渡すことができるので、最初は単体テストの目的のために最善のように思えました。次に、ユーザーが設定を取得するために、彼らは単にリポジトリを呼び出し、必要な設定名を渡します。

私は明るいアイデアがありました。私はSiteWideSettingsと呼ばれるシングルトンクラスを作った。そして、サイト上の各可能な設定はサイトのプロパティだった。 SiteSettingsが初めて呼び出されると、すべての設定が読み込まれます。いずれかのプロパティでSetが呼び出されると、リポジトリ関数を呼び出して設定を送信します。今私の設定ビューでは、私はSiteWideViewOptions.Currentを渡しているだけで、変更されたプロパティを更新しています。これは私のために働いていますが、それは単体のコンストラクタがプライベートであるため、シングルトンのコンストラクタにリポジトリを実際に渡すことができないため、単体テストできません。私が現在持っているのはうまくいきますが、それが最良のソリューションだとは思わないし、ユニットテストは実際には不可能です。

私は次のいずれかを考えていますが、どちらが最善かはわかりません。

  • SiteWideSettingsクラスにリポジトリのプロパティを追加渡すSiteWideSettingsクラスに機能を追加し、リポジトリ内
  • すべてで、このためにシングルトンを使用して、ちょうど私が前にやっていたものに戻っていません私はこのアイデアを持っていた。

これに関するコメントは非常に感謝しています。

注:わかっています。私はこの場合、ユニットテストを間違ってやっているのを知っています。私はテストを最初に書いていなかったので、私はそれを叱ってはいけません。私はすでに自分自身を叱っていました。約束は:)

答えて

1

は「それから私は明るいアイデアを持っていた。私は... SiteWideSettingsとと呼ばれるシングルトンクラスを作った」

これは悪いアイデアのように聞こえます。最新の状態に保つ必要があるメモリ内のキャッシュではなく、設定が何であるかについてデータベースを真実にすることができます。パフォーマンスのためにORMをキャッシュするようにしてください。そうしないと、複数のサーバーでサイトを実行しようとすると問題が発生するだけです。

コントローラーを簡略化して「セットアップ」と「分解」コードが少ないようにするには、IOC(たとえばAutofac)を使用して、必要な依存関係(たとえば、DataContextまたはRepository )をhttp-request単位で送信します。

コントローラをインスタンス化するだけで(コンストラクタを使用して依存関係を手動で注入する)、メソッドを呼び出すことができるため、アクションメソッドを簡単にテストできるようになりました。

+0

最新の状態に保つ限り、データベースとの間でSiteSettingsデータへのアクセスはすべてこのクラスから行われるため、あまり心配していません。複数のサーバーで実行することに問題がある可能性があります。私はまだSr.にいません。私が興味を持っているので、Webサーバーのクラスターを持つのではなく、どんな種類の問題があるのだろうか? 最後の開発拠点私はWebサーバーのクラスタに展開していましたが、問題は一度もありませんでした。私はちょうどあなたが見たこと、そしてこの状況がどのように問題に直面する可能性があるのか​​不思議です。クイックレスポンスありがとうございます –

+1

単一のサーバーでは簡単ですが、ローカルにキャッシュしても問題はありませんが、複数のシステムでデータベースを更新するとすぐに対処する必要があります。さらに重要なのは、理解したように、シングルトンには他の問題、特にテスト容易性に関する問題があります。 –

+0

アドバイスをいただきありがとうございます! –

関連する問題