如何使用依赖注入创建多个对象
本文关键字:对象 创建 注入 何使用 依赖 | 更新日期: 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.aspxForm继承了Control
注入的不是ListFrm,而是ListFrmFactory。让ListFrmFactory将ListRepository作为注入的依赖项。然后,您的工厂当然可以在需要的时候构建一个新的ListFrm,直接传入存储库。