如何使用依赖注入MVP for WinForms?

问题描述 投票:1回答:1

所以在我的观点中,我注入了我的演示者,因为我需要这样做才能使用我的活动。我的观点如下:

     public partial class ImpositionForm : Form, IImpositionFormView {
        private ImpositionFormPresenter presenter;
        private readonly ISignatureSizeManager signatureSizeManager;
        private readonly ISystemVariablesManager systemVariablesManager;
        private readonly string expectedPathToAppSettings = $"{AppDomain.CurrentDomain.BaseDirectory}/PrintAppSettings.txt";

        public event EventHandler<EventArgs> SetSheetSizeAcross;
        public event EventHandler<EventArgs> SetSheetSizeAround;
        public event EventHandler<ErrorEventArgs> Error;
        public event EventHandler<EventArgs> ClearPage;
        public event EventHandler<EventArgs> SetSignatureSize;
        public event EventHandler<EventArgs> ShowSystemVariablesForm;

        public ImpositionForm(ImpositionFormPresenter _presenter, ISignatureSizeManager _signatureSizeManager, 
            ISystemVariablesManager _systemVariablesManager) {
            presenter = _presenter;
            systemVariablesManager = _systemVariablesManager;
            signatureSizeManager = _signatureSizeManager;
            InitializeComponent();
        }

            //Other code
}

当我使用构建我的演示者时,我会注入视图:

  public class ImpositionFormPresenter {
        private readonly ISignatureSizeManager signatureSizeManager;
        private readonly ISystemVariablesManager systemVariablesManager;
        private readonly SystemVariablesFormPresenter systemVariablesFormPresenter;
        private readonly string pathToAppSettings = $"{AppDomain.CurrentDomain.BaseDirectory}/PrintAppSettings.txt";
        private readonly IImpositionFormView view;

        public ImpositionFormPresenter(IImpositionFormView _view, ISignatureSizeManager _signatureSizeManager,
            ISystemVariablesManager _systemVariablesManager, SystemVariablesFormPresenter _systemVariablesFormPresenter) {
            view = _view;
            signatureSizeManager = _signatureSizeManager;
            systemVariablesManager = _systemVariablesManager;
            systemVariablesFormPresenter = _systemVariablesFormPresenter;
            InitialiseEvents();
        }
        private void InitialiseEvents() {
            view.SetSheetSizeAcross += SetSheetSizeAcross;
            view.SetSheetSizeAround += SetSheetSizeAround;
            view.Error += LogErrorToView;
            view.SetSignatureSize += SetSignatureSizeValues;
            view.ShowSystemVariablesForm += OpenSystemVariablesForm;
        }

        //Other code
}

这是一个问题,因为我收到一个循环,其中视图依赖于演示者,演示者依赖于视图。

但是,我不确定如何解决此问题创建我的演示者和视图的新实例而不是注入它们。谁能帮助我,所以我可以继续使用依赖注入?

c# winforms dependency-injection mvp
1个回答
0
投票

视图/表单根本不应该引用演示者。与演示者的任何通信都应通过演示者订阅的事件来完成。

从那里你可以让Form实例化具体的演示者并传递一个引用给自己,或者你可以让你的作品root / IOC容器创建两者并将视图传递给演示者。在前一种情况下,具体视图需要以某种方式获取演示者所需的所有其他依赖项。

有关组合根的更多信息,请参阅this answer

这里需要注意的是订阅会创建一个循环引用,以防止垃圾回收。因此,您应该让视图触发一个事件,指示它正在关闭。然后,演示者可以正常地进行垃圾收集。

© www.soinside.com 2019 - 2024. All rights reserved.