如何使用依赖注入创建多个对象

本文关键字:对象 创建 注入 何使用 依赖 | 更新日期: 2023-09-27 18:13:44

我正在使用c#。,但任何相关的例子都是非常可以接受的。

我有两个winforms,让我们说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,因为它不能创建一个新的ListFrm,它需要一个ItemRepository依赖。

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

如果没有依赖注入,每次我需要它的时候我就调用new ListFrm()

谢谢!

如何使用依赖注入创建多个对象

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

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
        }
    }
}

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

请勿丢弃表单。把它藏起来!

使用这个方法:

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

Form继承了Control

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