懒惰<t> - 总是创建一个新对象?

时间:2015-10-02 05:29:50

标签: c#

我正在使用MEF(依赖注入,构造函数注入)导入Lazy<MyForm>对象,并且基本上存在问题,当我显示并关闭表单并且之后尝试再次打开表单时,它赢得了&#39;再工作,导致物体已被处理掉。我希望每次打开它时都有一个全新的表单实例。

是否有类似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);
    }
}

2 个答案:

答案 0 :(得分:1)

您可能正在寻找factory method,可以直接作为委托传递给您的表单,也可以包含在某个界面的潜在匿名实现中。

Lazy<T>实际上只有在最后一个可能的时间点初始化某些T的目的,即在真正需要时。为此,它只是调用类型T的默认构造函数,或者以Func<T>委托的形式执行提供的工厂方法。

您可以将Func<T>传递给您的表单而不是围绕它的Lazy<T>包装。

答案 1 :(得分:0)

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

解决方案是:

  1. 将我的Lazy<T>导入更改为ExportFactory<T>个导入
  2. 使用[PartCreationPolicy(CreationPolicy.NonShared)]属性
  3. 导出我的所有观看次数

    这样,每当您拨打m_myViewExportFactory.CreateExport().Value时,它都会为您提供一个新的视图实例。