我有一个使用UserControls扩展的主机WinForm应用程序。组合和实例化在初始启动时工作得很好。当我关闭用户控件时,我想假设它应该是Disposed。但是,当我想再次显示用户控件时,这会导致问题。
我想要做的是在确保对象已处置任何资源后,将用户控件返回到其原始状态。
以下是扩展程序用户控件之一:
[ExportMetadata ( "ModuleName", "ContactManager" )]
[Export ( typeof ( IUserModule ) )]
partial class ucxContactManager : IUserModule
{
#region Fields
// Fields
readonly string moduleName = "ContactManager";
readonly string moduleDescription = "Contact Manager Extension Module";
// called from ucxContactManager constructor
void InitializeUserModule ( )
{
Closing += ( o, e ) => Dispose ( );
uxCloseContactForm.Click += ( o, e ) => Closing ( this, null );
}
// IUserModule Members
public event EventHandler<EventArgs> Closing = delegate { };
}
CompositionController完成所有发现和合成工作,提供了一种请求特定模块的方法:
// Lazily import all IUserModule interfaces
[ImportMany ( typeof ( IUserModule ), AllowRecomposition = true )]
public IEnumerable<Lazy<IUserModule, IQueryMetadata>> Modules { get; set; }
public bool TryGetModule ( string ModuleName, out IUserModule Module )
{
var module = Modules.Where ( m => m.Metadata.ModuleName == ModuleName )
.Select ( m => m )
.FirstOrDefault ( );
if (module != null)
{ Module = module.Value; }
else
{ Module = null; }
return Module != null;
}
现在,当我们找到模块时,分配module.Value
会导致UserControl被初始化 - 调用构造函数。
关闭并处理UserControl后,如何将模块返回到初始状态?
答案 0 :(得分:1)
我认为您的问题是您要将Module
设置为module.Value
,因此您要通过IUserModule
实例实例化Lazy<IUserModule, IQueryMetadata>
。如果您以后不需要它,为什么不将Module
设置为Lazy<IUserModule, IQueryMetadata>
实例,然后在需要时创建它的实例。
您可能需要考虑的另一件事是零件的使用寿命。除非您正在重构Modules
集合,否则您将只有IUserModule
的一个实例,因为它是通过Lazy<,>
实例创建和实例化的。你可能想要考虑的是每次都使用ExportFactory<IUserModule, IQueryMetadata>
来启动一个新实例。
ExportFactory
不是.NET 4.0的一部分(它是Silverlight的一部分,但不是完整的.NET 4.0 BCL.Glenn Block为.NET 4发布了它的一个版本,你可以得到它{{3} }。