繁体   English   中英

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

[英]How to create object more than once with dependency injection

我正在使用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()

谢谢 !

您可以使用委托注入来处理这种情况。 这将使您能够将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
        }
    }
}

我没有弄清楚您要怎么做,在这里,您只需要关闭列表表单而不是处理它,您的详细信息表单中只有一个实例,因此在处理它时,您将无法使用它。下次,如果要在表单类之间建立松散耦合的依赖关系,则应定义一个接口,listForm应该实现它,并且在detailForm中,必须在您的接口类型中具有listForm的实例,以获取更多信息。来自MSDN的本文: 依赖注入

不要丢弃表格。 藏起来吧!

使用此方法:

http://msdn.microsoft.com/zh-CN/library/system.windows.forms.control.hide.aspx

通知Form从Control继承

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM