我正在使用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);
}
}
答案 0 :(得分:1)
您可能正在寻找factory method,可以直接作为委托传递给您的表单,也可以包含在某个界面的潜在匿名实现中。
Lazy<T>
实际上只有在最后一个可能的时间点初始化某些T
的目的,即在真正需要时。为此,它只是调用类型T
的默认构造函数,或者以Func<T>
委托的形式执行提供的工厂方法。
您可以将Func<T>
传递给您的表单而不是围绕它的Lazy<T>
包装。
答案 1 :(得分:0)
好的,正如我在评论中所述,我自己也找到了解决方案。
解决方案是:
Lazy<T>
导入更改为ExportFactory<T>
个导入[PartCreationPolicy(CreationPolicy.NonShared)]
属性这样,每当您拨打m_myViewExportFactory.CreateExport().Value
时,它都会为您提供一个新的视图实例。