【发布时间】:2013-05-16 07:30:02
【问题描述】:
我使用的是 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()。
谢谢!
【问题讨论】:
-
为什么要处理表单?
-
你为什么要这样处理
ListFrm实例? -
好吧,选择第二次实际上并不是必需的情况,而只是为了适应这种可能性。而且我认为不再需要时无需维护资源消耗形式。我应该隐藏它吗?
标签: c# .net design-patterns dependency-injection inversion-of-control