[英]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.