パフォーマンスに重大な影響がない限り、理想的な論理セットアップは、これがモデル内で行われることです。
よく言われるのは、「コントローラーは軽く、モデルは重く保つ」というものです。(誰が最初に言ったのかはわかりません。)
コントローラーはモデルにデータを入力するべきではありません。モデルのインスタンスを取得してビューに提供するだけです。せいぜい、いくつかのルーティング ロジック (どのビューを送信するか、またはリダイレクトで応答するかを決定するなど) を実行し、基本的には、モデルとビュー/UI の間の相互作用を制御する必要があります。
したがって、次のような代わりに:
public ActionResult Index()
{
var model = WidgetFactory.Create();
model.SomeProperty = DataService.GetPropertyInfo();
return View(model);
}
あなたはこれをしているはずです:
public ActionResult Index()
{
var model = WidgetFactory.Create();
return View(model);
}
モデルでこれを使用します:
public SomeType SomeProperty
{
get
{
return DataService.GetPropertyInfo();
}
}
または、データの取得にオーバーヘッドがある場合は、次のようになります。
private SomeType _someProperty = null;
public SomeType SomeProperty
{
get
{
if (_someProperty == null)
_someProperty = DataService.GetPropertyInfo();
return _someProperty;
}
}
SomeProperty
これには、モデルに関する限り不変になるという追加の利点があります。そのデータを変更することはなく、提供するだけであるため、コントローラーが使用できるそのプロパティのセッターを用意する理由はありません。
ここでの考え方は、モデルが自己完結型であり、可能な限り自己完結型であるということです。または、可能な限りカプセル化します。それ自体がビジネスコンセプトを表しています。そのビジネス コンセプトの一部が別のシステムに存在するデータである場合、モデルはそれをカプセル化します。Widget
がデータを取得する場所を物理的に知ることは、コントローラの責任ではありませんSomeProperty
。Widget
がそのデータを公開していることを知っているだけです。がどこでWidget
それを取得するかは 次第Widget
です。