我正在使用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()
。
谢谢!
答案 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,直接传入存储库。