Lazy< T>-总是创建一个新对象
本文关键字:新对象 对象 一个 创建 Lazy | 更新日期: 2023-09-27 18:15:50
我正在使用MEF(依赖注入,构造函数注入)导入Lazy<MyForm>
对象,并且基本上有问题,当我显示并关闭表单并随后再次尝试打开表单时,它将不再工作,因为对象已经被处置。我希望每次打开表单时都有一个全新的表单实例
是否有一个类类似于Lazy<T>
,但总是给我一个新的对象?
我现在不能给你我的代码,但我会更详细地说:
有两种形式:
Form1是起始表单,它有一个ImportingConstructor,它当前导入一个Lazy<Form2>
对象。我的Form2
也有一个ImportingConstructor,它导入一些其他类。当我点击Form1
上的按钮时,m_lazyForm2.Value
正在被访问,Form2
出现。
MEF(和我的Form1)是使用我自己构建的这个引导程序初始化的。
internal class Bootstrapper<T> where T : Form
{
[Import]
private T m_frmStartup;
private CompositionContainer m_container;
public void Init()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
catalog.Catalogs.Add(new DirectoryCatalog("."));
var batch = new CompositionBatch();
batch.AddPart(catalog);
m_container = new CompositionContainer(catalog);
m_container.ComposeParts(this);
}
public void Start()
{
Application.Run(m_frmStartup);
}
}
您可能正在寻找一个工厂方法,要么直接作为委托传递给您的表单,要么包装成某个接口的潜在匿名实现。
Lazy<T>
实际上只用于在最后可能的时间点初始化一些T
,即当它确实需要时。为此,它要么简单地调用类型T
的默认构造函数,要么以Func<T>
委托的形式执行提供的工厂方法。
你可以把Func<T>
传递给你的表单,而不是它周围的Lazy<T>
包装器。
好的,正如我在评论中所说的,我自己已经找到了解决方案。
解决方案是:
- 将
Lazy<T>
导入更改为ExportFactory<T>
导入 - 导出所有具有
[PartCreationPolicy(CreationPolicy.NonShared)]
属性的视图
这样,每次你调用m_myViewExportFactory.CreateExport().Value
,它会给你一个新的视图实例