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>-总是创建一个新对象

您可能正在寻找一个工厂方法,要么直接作为委托传递给您的表单,要么包装成某个接口的潜在匿名实现。

Lazy<T>实际上只用于在最后可能的时间点初始化一些T,即当它确实需要时。为此,它要么简单地调用类型T的默认构造函数,要么以Func<T>委托的形式执行提供的工厂方法。

你可以把Func<T>传递给你的表单,而不是它周围的Lazy<T>包装器。

好的,正如我在评论中所说的,我自己已经找到了解决方案。

解决方案是:

  1. Lazy<T>导入更改为ExportFactory<T>导入
  2. 导出所有具有[PartCreationPolicy(CreationPolicy.NonShared)]属性的视图

这样,每次你调用m_myViewExportFactory.CreateExport().Value,它会给你一个新的视图实例