在处理该表单之前,如何使用autofac解析(非模态)表单的单个实例?

时间:2011-05-18 20:07:33

标签: winforms autofac

我正在编写系统托盘实用程序,您可以从菜单中为应用程序打开几种不同的窗体。我正在使用autofac来解决这些表单的创建,必要时给我的主要形式Func和Func依赖。

如果用户选择激活表单的选项,如果已经显示,则应该获得焦点,否则autofac应该创建新表单。

我真的不希望这些表单在不使用时存放在内存中,所以当用户关闭它时,我目前正在让表单自行处理。

我需要知道的是我如何通知autofac表格已被处理,以便:

  1. 它不再包含对已处置表格的引用(因此可以进行垃圾收集)
  2. 当我接下来为表单实例请求autofac时,它会创建一个新表单。
  3. 我一直在阅读Autofac wiki,我猜我只需要正确设置LifetimeScope。

1 个答案:

答案 0 :(得分:4)

你正在做的事情有点超出常规,所以我不认为Autofac的标准生命周期镜适用。我有一个类似的场景,我有一个类型,我想要一个可替换/可重新加载的类型的单个实例。我做的是注册一个包装类。适应Winform,看起来像......

public class SingletonFormProvider<TForm> : IDisposable
    where TForm: Form
{
    private TForm _currentInstance;
    private Func<TForm> _createForm;

    public SingletonFormProvider(Func<TForm> createForm)
    {
        _createForm = createForm;
    }

    public TForm CurrentInstance
    {
         get
         {
              if (_currentInstance == null)
                  _currentInstance = _createForm();

              // TODO here: wire into _currentInstance close event
              // to null _currentInstance field

              return _currentInstance;
         }
    }

    public void Close()
    {
        if (_currentInstance == null) return;

        _currentInstance.Dispose();
        _currentInstance = null;
    }

    public void Dispose()
    {
        Close();
    }
}

然后你可以注册

builder
    .Register(c => new SingletonFormProvider<YourForm>(() => new YourForm())
    .AsSelf()
    .SingleInstance();
builder
    .Register(c => c.Resolve<SingletonFormProvider<YourForm>>().CurrentInstance)
    .AsSelf();