0

私は C#.Net を使用していますが、関連する例はすべて受け入れられます。

ListFrm と DetailFrm の 2 つの winform があります。ユーザーが DetailFrm のボタンをクリックするたびに、新しい ListFrm がポップアップして、ユーザーが選択した項目を変更できるようになります。

詳細フレーム.cs

public class DetailFrm
{
    private readonly ListFrm _listFrm;

    public DetailFrm(ListFrm listFrm)
    {
        _listFrm = listFrm;
    }

    private SelectButton OnClick(object sender, EventArgs e)
    {
        using(listFrm)
        {
            listFrm.ShowDialog();

            // Do detail data filling here
        }
    }
}

ListFrm.cs

public class ListFrm
{
    public Item SelectedItem { get; set; }

    private readonly ListRepository _listRepository;

    public ListFrm(ListRepository listRepository)
    {
        _listRepository = listRepository;
    }

    private ListFrm_Load(object sender, EventArgs e)
    {
        List<Item> listItem = _listRepository.GetAll();

        // Do adding to datagridview
    }

    private dataGridViewSelect_CellDoubleClick(object sender, EventArgs e)
    {
        SelectedItem = // Selected in datagridview

        this.Dispose;
    }
}

私の問題は、DetailFrm の参照ボタンを 2 回クリックしたときに、既に破棄されているため、ListFrm が読み込まれないことです。

依存性注入でこれを行う方法は? ItemRepository 依存関係を必要とする新しい ListFrm を作成できないため、ListFrmFactory を作成できません。

また、DIContainer はサービス ロケータになるため、あちこちに渡したくありません。

依存性注入なしで実行した場合は、new ListFrm()必要なときに呼び出すだけです。

ありがとう !

4

4 に答える 4

0

何をするつもりなのかわかりませんでした。ここでは、リストフォームを破棄する代わりに閉じる必要があります。詳細フォームにはそのインスタンスが1つしかないため、破棄すると、リストフォームで使用できませんでした次回、フォームクラス間に疎結合の依存関係を作成する場合は、インターフェイスを定義する必要があり、listForm でそれを実装する必要があります。detailForm には、インターフェイスのタイプに listForm のインスタンスが必要です。 MSDN のこの記事: 依存性注入

于 2013-05-16T07:44:59.517 に答える
0

ListFrm を注入するのではなく、ListFrmFactory を注入します。ListFrmFactory に、注入された依存関係として ListRepository を取得させます。その後、ファクトリはもちろん、必要なときにいつでも新しい ListFrm を構築し、リポジトリを直接渡すことができます。

于 2013-05-16T20:34:43.233 に答える