使用UserControls进行扩展:如何将可组合部件返回到初始状态?

时间:2011-07-10 16:22:08

标签: c# winforms .net-4.0 user-controls mef

我有一个使用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后,如何将模块返回到初始状态?

1 个答案:

答案 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} }。