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

时间:2013-05-16 07:30:02

标签: c# .net design-patterns dependency-injection inversion-of-control

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

我有2个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,因为它无法创建需要ItemRepository依赖项的新ListFrm。

我也不想在任何地方传递DIContainer,因为它将是一个服务定位器。

如果没有依赖注入,我只需在每次需要时调用new ListFrm()

谢谢!

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

请勿处理表格。只是隐藏吧!

使用此方法:

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

notice表单从Control

继承

答案 3 :(得分:0)

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