3

メイン フォームにいくつかのメニュー項目があるとします。メニュー項目ごとに別のフォームが表示されます。次のコードは、このシナリオで依存性注入を行う良い方法ですか?

public class MainForm: Form {
  private IAboutForm _aboutForm;
  private IOptionsForm _optionsForm;
  private IDownloadsForm _downloadsForm;

  MainForm(IAboutForm aboutForm, IOptionsForm optionsForm, IDownloadsForm downloadsForm) { // add as many form dependencies as required
    _aboutForm = aboutForm;
    _optionsForm = optionsForm;
    _downloadsForm = downloadsForm;

    InitializeComponent();
  }

  private void AboutMenuItem_Click(object sender, System.EventArgs e) {
    _aboutForm.ShowDialog(this);
  }

  private void DownloadsMenuItem_Click(object sender, System.EventArgs e) {
    _downloads.Show();
    _downloads.BringToFront();
  }

}
4

1 に答える 1

9

これはそのままでも問題なく動作しますが、うまく拡張できません。フォームを追加し続けると、しばらくするとコンストラクタが巨大化します。これ以上追加しない場合は、おそらく問題ありません。さらに追加することがわかっている場合、または追加するつもりはないが最終的に追加することになる場合は、次のように、代わりに何らかの IFormFactory を挿入することをお勧めします。

IFormsFactory formsFactory;
MainForm(IFormsFactory formsFactory)
{
    _formsFactory = formsFactory;
}

その後、必要に応じて依存フォームを作成できます。

private void AboutMenuItem_Click(object sender, System.EventArgs e) {
    IAboutForm aboutForm = _formsFactory.CreateAboutForm();
    aboutForm.ShowDialog(this);
}

これにはいくつかの方法があります。すべてのフォームをメンバー変数として保持し、注入されたファクトリを使用してコンストラクターでフォームを作成するだけです。これは、パフォーマンスが懸念される場合に適しています。また、プログラムの存続期間中、それぞれに 1 つのインスタンスのみが必要です。

factory.CreateXXX()必要に応じて、「構築」パラメータを呼び出しに追加できることに注意してください。

工場内では、各フォームの作成方法を知っています。IoC コンテナーを使用する場合、IFactory インターフェイスの具象を作成する必要さえありません。ただし、フォームの作成に特別なロジックがある場合は、代わりに具象を作成し、注入された IFactory をその具象に解決することができます。

これについてはまだ多くのことが言えますが、これは良い出発点だと思います。それが役に立てば幸い。

于 2013-05-10T19:27:24.033 に答える