0

我正在使用 C#.Net,但任何相关示例都可以接受。

我有 2 个 winform,比如说 ListFrm 和 DetailFrm,其中每次用户单击 DetailFrm 中的按钮时,都会弹出一个新的 ListFrm,以便用户可以更改所选项目。

DetailFrm.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 的浏览按钮时,ListFrm 不会加载,因为它已经被处理掉了。

如何使用依赖注入来做到这一点?我无法创建 ListFrmFactory,因为它无法创建需要 ItemRepository 依赖项的新 ListFrm。

我也不想到处传递 DIContainer,因为它是一个服务定位器。

如果它在没有依赖注入的情况下完成,我会在new ListFrm()每次需要时调用它。

谢谢 !

4

4 回答 4

3

您可以使用委托注入来处理这种情况。这将使您能够将容器配置保存在一个地方,并在每次需要时创建一个新实例。

public class DetailFrm
{
    private readonly Func<ListFrm> _listFrmInstance;

    public DetailFrm(Func<ListFrm> listFrmInstance)
    {
        _listFrmInstance = listFrmInstance;
    }

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

            // Do detail data filling here
        }
    }
}
于 2013-05-16T08:41:30.393 回答
0

我不知道你要做什么,在这里你只需要关闭你的列表表单而不是处理它,你的详细表单中只有一个实例,所以当你处理它时,你不能使用它下一次,如果你想在你的表单类之间建立松散耦合的依赖关系,你应该定义一个接口,你的 listForm 应该实现它,并且在你的 detailForm 中,你必须有一个 listForm 的实例,你可以在你的接口类型中获取更多信息,你可以看看在这篇来自 MSDN 的文章中: 依赖注入

于 2013-05-16T07:44:59.517 回答
0

不要丢弃表格。只是隐藏它!

使用此方法:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.hide.aspx

注意 Form 继承自 Control

于 2013-05-16T07:52:07.750 回答
0

与其注入 ListFrm,不如注入 ListFrmFactory。让 ListFrmFactory 将 ListRepository 作为注入依赖项。然后你的工厂当然可以在需要时构建一个新的 ListFrm,直接传入存储库。

于 2013-05-16T20:34:43.233 回答