MVP,是否应在Main()中创建Presenter或View

时间:2012-10-16 17:42:49

标签: c# inversion-of-control mef mvp

我一直在与MVP作斗争,特别是如何让程序启动时间超过我承认的时间。目前我在program.cs中创建了所有类的实例。然后我只调用application.Run(userInterface);以下是我现有设置的一部分。

static void Main()
{
    //...

    Status _status = new Status();
    Logger _logger = new Logger(entity, readerWriter, true);
    VerifyRow _verifyRow = new VerifyRow(entity, _logger);
    VerificationOfDataTypes _verification = new VerificationOfDataTypes(entity, _logger, _verifyRow, _status, readerWriter);

    var verify = new CsvFileVerification(entityVerification, _verification, _logger);

    CancellationTokenSource cts = new CancellationTokenSource();
    var source = new CancellationTokenSourceWrapper();

    var presenter = new MainPresenter(userInterface, browser, helper, entity, verify, source);
    Application.Run(userInterface);
}

我有MVP设置atm的方式,MainView实现了IMainView。然后,演示者将IMainView注入其构造函数,以及其他类的负载。

    public MainPresenter(IMainForm view, IFileDialog dialog, IMainPresenterHelper helper, IUserInputEntity entity, ICsvFileVerification verify, ICancellationTokenSource source)
    {
        _view = view;
        _dialog = dialog;
        _helper = helper;
        _entity = entity;
        _verify = verify;
        _source = source;

        view.ComposeCollectionOfControls += ComposeCollectionOfControls;
        view.SelectCsvFilePath += SelectCsvFilePath;
        view.SelectErrorLogFilePath += SelectErrorLogFilePath;
        view.DataVerification += DataVerification;
    }

我已被告知MEF或IOC容器可以帮助整理它,但我仍然不确定我应该如何构建这个。我有一种直觉,应该首先创建演示者,但是我会在我的Main()方法中声明一个随机变量,然后不再使用它。那么如何创建视图呢?

我之前有一个与MEF合作的控制台应用程序,但我无法弄清楚如何使用mvp跳转到winforms / winforms。

对此的任何指示都会非常感激。

编辑,我尝试了以下但是无法使用以下内容。它实际上试图创建2个视图。如何引用由

创建的原始视图
"Application.Run(new Form1());"

在Program.cs

以下是我将Form1类更改为。

namespace Mini_MVP_MEF
{
    [Export(typeof(IView))]
    public partial class Form1 : Form, IView
    {
        private IPresenter _presenter;

        public Form1()
        {
            InitializeComponent();
            _presenter = Program._myContainer.GetExport<IPresenter>().Value;
        }

        //....

    }
}

刚刚尝试在InitializeComponents()之后调用以下方法;在Form1

    private static void PopulateContainer()
    {
        var presenter = new AssemblyCatalog(typeof(Presenter.MVPPresenter).Assembly);
        var model = new AssemblyCatalog(typeof(Model.MVPModel).Assembly);
        var view = new AssemblyCatalog(System.Reflection.Assembly.GetCallingAssembly());
        var aggregateCatalog = new AggregateCatalog(model, presenter, view);
        _myContainer = new CompositionContainer(aggregateCatalog);
    }

但它也不起作用。

1 个答案:

答案 0 :(得分:2)

没有视图的演示者没有意义。它应该在视图内部创建,视图将自己传递给演示者。

例如:

public class MainView : IMainView
{
    IMainPresenter _presenter;
    public MainView()
    {
       _presenter = new MainPresenter(this);
    }
}

顺便说一下,还要确保您的视图具有可注射的演示者,例如。另一个构造函数,您可以在其中为单元测试注入演示者