次のフォルダーを含む asp.net-mvc Web サイトがあります。
- コントローラー
- スクリプト
- ビュー
- ビューモデル
- モデル
- ドメインモデル
私は今、このビジネス ロジックとデータベース アクセス コードとデータの多くに別の .net アプリ (Windows コンソール アプリなので Web ではありません) にアクセスしたいので、MVC プロジェクトの外にあるものをできるだけ削除するようにリファクタリングしています。コードをこの他のソリューションと共有できるように、ソリューション内の他のプロジェクトに。
主な問題が 2 つあります。
私の主な問題は、ViewModel を生成するコードを配置する場所を見つけるのに苦労していることです。これは、コンソール アプリが同じデータを必要とする電子メールを送信するときに、このコードの多くをコンソール アプリで再利用したいからです。見る。
もう 1 つの主な問題は、ビューモデルをインスタンス化する関数の多くが一連のデータベース アクセス コードで始まる場合に、内部にビューモデルを保持しながら、データベース アクセス コードを MVC プロジェクトから移動する方法を理解するのに苦労していることです。
これまでの詳細と私のプロセスの一部を次に示します。
ステップ 1 - DomainModel を別のプロジェクトに移動 - 成功
そのため、DomainModel プロジェクトの移動は簡単でした (これは、いくつかのビジネス ロジックが上にある多くの生のオブジェクトであり、それについては何も問題がありませんでした)。
ステップ 2 - コントローラーを間引く - 成功
コントローラーをできる限り間引いて、ビジネス ロジックや複雑なデータ アクセス ロジックを Models フォルダーに移動しました。モデル フォルダーを MVC プロジェクトの外に移動しようとすると、いくつかのことが壊れました。
ステップ 3 - Models フォルダーを MVC プロジェクトの外に移動しようとする - 苦労
コントローラーを間引いて、モデル クラスに移動し、ビューに戻す ViewModel を返すさまざまなコントローラー アクションをいくつか用意しました。このようなもの(私のコントローラークラスで):
public ActionResult ApplicationDetail(int id)
{
AppDetailViewModel applicationViewModel = Model.GenerateAppDetailViewModel(id);
return View(applicationViewModel);
}
したがって、Model フォルダー内のファイルは ViewModel クラスに依存しています。複数の異なるコントローラーで使用される GenerateAppDetailViewModel() 関数を集中管理したいと考えています。また、私のコンソール アプリ (電子メールを送信する) では、たまたまあるビューにあるすべてのデータを取得したいことがよくあるので、私のコードはビューモデルも活用したいと考えています.. MVC プロジェクトから移動した場合その後、再利用できますが、依存関係の問題があると思います(明らかに、コンソールアプリで SelectListItem は必要ありませんが、再利用したいビューを生成するために必要な異なるデータのコンテナオブジェクトにすぎない場合もあります)
または壊れた別のことは、次への依存関係でした:
System.Web.Mvc
私は多くのコードを持っているので:
- データベース内のテーブルにクエリを実行する
- それをオブジェクトのコレクションに変換します(私はnhibernateを使用しています)
- これを、System.web.mvc の一部である DTO オブジェクト (ViewModels フォルダーにある) または SelectListItem オブジェクトのリスト (ビューにドロップダウンを設定するために使用) に変換します。
この依存関係を解消する最善の方法についての提案を探して、再利用のために MVC プロジェクトからできるだけ多くのコードを移動できるようにしたいと考えました。
問題は、ViewModel コードを Model フォルダーと別のプロジェクトに吸い込もうとすると、ViewModel クラスが多くの依存関係を持っているため、スタックすることです。
System.Web.Mvc
SelectListItem などが原因です。
2 つのビュー モデル フォルダーが必要です (1 つは特定の system.web.mvc 参照を持つ MVC プロジェクトにあり、もう 1 つは別のプロジェクトにありますか?)。SelectListItem への依存関係が競合を引き起こし続けているようです
私が見たほとんどの例では、このチュートリアルのように、ViewModels が System.Web.Mvc に依存しています。
私はこれらの質問を見てきました:
- Asp.Net MVC SelectList リファクタリングの質問?
- selectlist ロジックは、ASP.NET MVC、ビュー、モデル、またはコントローラーのどこに配置する必要がありますか?
これらは一種の関連性がありますが、記載されている私の特定の全体的なリファクタリングの質問に答えているかどうかはわかりません。