C# Unity IOC与winforms MVP多实例

C# Unity IOC与winforms MVP多实例,c#,dependency-injection,inversion-of-control,unity-container,C#,Dependency Injection,Inversion Of Control,Unity Container,我要做的是在主窗体内多次启动窗体 我在视图和演示者之间有1对1的关系。 因此,当预中心或视图被释放时,它们都将从内存中释放 我只是不知道如何做到这一点 我可以成功启动标签表单一次,但在我的按钮上单击我想启动更多标签表单 [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(

我要做的是在主窗体内多次启动窗体 我在视图和演示者之间有1对1的关系。 因此,当预中心或视图被释放时,它们都将从内存中释放

我只是不知道如何做到这一点

我可以成功启动标签表单一次,但在我的按钮上单击我想启动更多标签表单

   [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();
    }
  
}
[STAThread]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var unityContainer=新的unityContainer();
RegisterType(新的ContainerControlled LifetimeManager());
RegisterType(新的ContainerControlled LifetimeManager());
RegisterType(新的PerResolveLifetimeManager());
RegisterType(新的PerResolveLifetimeManager());
IMainPresenter mainPresenter=unityContainer.Resolve();
IMainViewUC mainView=mainPresenter.GetView();
Application.Run((MainViewUC)mainView);
}
公共类主演示者:IMainPresenter
{
私有IMainViewUC\u视图=null;
私有ITagsPresenter _tagsPresenter=null;
公共主演示者(IMainViewUC视图,ITAGPresenter标记ReseCenter)
{
_视图=视图;
_tagsPresenter=tagsPresenter;
_view.TagsViewEventRaised=((IMainPresenter)this).OnTagsView;
}
void IMainPresenter.OnTagsView()
{
变量视图=_tagsPresenter.GetView();
_视图。添加MDIChildView(视图);
}
void IMainPresenter.AddChildView(IView视图)
{
_视图。添加MDIChildView(视图);
}
IMainViewUC IMainPresenter.GetView()
{
返回视图;
}
}
公共部分类MainViewUC:Form,IMainViewUC
{
动作IMainViewUC.TagsViewEventRaised{get;set;}
公共MainViewUC()
{
初始化组件();
}
void IMainViewUC.AddMdiChildView(IView视图)
{
var form=(form)视图;
form.MdiParent=此;
form.Show();
}
私有无效工具StripMenuItem\u标记\u单击(对象发送方,事件参数e)
{
((IMainViewUC)this).TagsViewEventRaised();
}
}

我认为unity3d标签在这里不适用,你是说unity(框架,unity3d是游戏引擎)谢谢,我加入了unity,它会自动解析到unity3d