首页 > 解决方案 > Unity IOC 与 winforms MVP 多个实例

问题描述

我想要做的是在主窗体内多次启动一个窗体,我在视图和演示者之间有 1 对 1 的关系。因此,当 presnter 或 view 被处理时,它们都会从内存中释放

我只是不知道如何实现这一点。

我能够成功启动标签表单一次,但是在我的按钮上单击我想启动更多标签表单。

   [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var unityContainer = new UnityContainer();
        unityContainer.RegisterType<IMainViewUC, MainViewUC>(new ContainerControlledLifetimeManager());
        unityContainer.RegisterType<IMainPresenter, MainPresenter>(new ContainerControlledLifetimeManager());
        unityContainer.RegisterType<ITagsPresenter, TagsPresenter>(new PerResolveLifetimeManager());
        unityContainer.RegisterType<ITagsViewUC, TagsViewUC>(new PerResolveLifetimeManager());
        IMainPresenter mainPresenter = unityContainer.Resolve<MainPresenter>();
        IMainViewUC mainView = mainPresenter.GetView();
        Application.Run((MainViewUC)mainView);
    }


public class MainPresenter :IMainPresenter
{
    private IMainViewUC _view = null;
    private ITagsPresenter _tagsPresenter = null;
    public MainPresenter(IMainViewUC view, ITagsPresenter tagsPresenter)
    {
        _view = view;
        _tagsPresenter = tagsPresenter;
        _view.TagsViewEventRaised = ((IMainPresenter)this).OnTagsView;
    }


    void IMainPresenter.OnTagsView()
    {
        var view = _tagsPresenter.GetView();
        _view.AddMdiChildView(view);
    }

    void IMainPresenter.AddChildView(IView view)
    {
        _view.AddMdiChildView(view);
    }

    IMainViewUC IMainPresenter.GetView()
    {
        return _view;
    }
}

public partial class MainViewUC : Form, IMainViewUC
{
  
    Action IMainViewUC.TagsViewEventRaised { get; set; }

    public MainViewUC()
    {
        InitializeComponent();
    }

    void IMainViewUC.AddMdiChildView(IView view)
    {
        var form = (Form)view;
        form.MdiParent = this;
        form.Show();
    }

    private void toolStripMenuItem_tags_Click(object sender, EventArgs e)
    {
        ((IMainViewUC)this).TagsViewEventRaised();
    }
  
}

标签: c#dependency-injectioninversion-of-controlunity-container

解决方案


推荐阅读