編集
基本的に、ここでコンストラクターの依存関係の数を減らすためにこれらのオプションがあるようです:
- コントローラーを分割する
- 2 つのインターフェイスの前にレイヤーを追加します
- プロパティインジェクションに切り替える
- サービスロケーター
#3 と #4 は適切な測定のために含まれていますが、明らかに実際に依存関係の数を減らすわけではなく、コンストラクターからそれらを隠すだけです。また、いくつかの欠点もあり、ほとんどの場合、サービス ロケーターは特に悪いと考えています。
#1については、コンストラクターが実際に2つ以上のジョブを実行していると感じ、分割できる明確な分離がある場合は、そうします。しかし、あなたの回答から、あなたはすでにこれを検討しており、これをしたくないと思います。
それは#2を残します-別のレイヤーを追加します。この場合、その特定のビュー モデルのファクトリ インターフェイスを導入することになります。単純に、この ICreateTestplanViewModelFactory に名前を付けますが、必要に応じて、アプリにとってより意味のある名前を付けることができます。その上の単一のメソッドは、CreateTestplanViewModel を構築します。
これにより、このビューのデータが 2 つのソースから取得されているという事実は、実装の詳細にすぎません。コンストラクターの依存関係として IReleaseDataProvider と ITemplateDataProvider を取る実装を結び付けます。
これは、私が提案していたことに沿っています。
public interface IProvideTestPlanSetupModel
{
CreateTestplanViewModel GetModel();
}
public class TestPlanSetupProvider : IProvideTestPlanSetupModel
{
private readonly IReleaseDataProvider _releaseDataProvider;
private readonly ITemplateDataProvider _templateDataProvider;
public TestPlanSetupProvider(IReleaseDataProvider releaseDataProvider, ITemplateDataProvider templateDataProvider)
{
_releaseDataProvider = releaseDataProvider;
_templateDataProvider = templateDataProvider;
}
public CreateTestplanViewModel GetModel()
{
var releases = _releaseDataProvider.GetReleases();
var templates = _templateDataProvider.GetTemplates();
return new CreateTestplanViewModel(releases, templates);
}
}
public class TestPlanController : Controller
{
private readonly IProvideTestPlanSetupModel _testPlanSetupProvider;
public TestPlanController(IProvideTestPlanSetupModel testPlanSetupProvider)
{
_testPlanSetupProvider = testPlanSetupProvider;
}
[HttpGet]
public ActionResult Create()
{
var createTestplanViewModel = _testPlanSetupProvider.GetModel();
return PartialView(createTestplanViewModel);
}
}
コントローラーの外側にビュー モデルを構築したくない場合は、ビュー モデルにコピーするのと同じプロパティを持つ中間オブジェクトをインターフェイスで提供できます。しかし、これはばかげています。このデータの組み合わせは、ビュー モデルが表現するはずの特定のビューにのみ関連するからです。
余談ですが、同じモデルを介して読み取り/書き込みを行うと、かなり一般的な煩わしさに遭遇しているようです。これらの問題が気になるので、CQRS を調査することをお勧めします。これにより、これらのタイプのクエリについてデータベースと直接やり取りすることについての不快感が軽減され、私たちが楽しんでいる階層化の迷路を回避するのに役立つでしょう。有望に思えますが、まだ実稼働アプリケーションでテストする喜びはありませんでした。