2

私は 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);
    }

しかし、どちらも機能していません。

4

1 に答える 1

2

ビューのないプレゼンターは意味がありません。ビューがプレゼンターに渡されるビュー内に作成する必要があります。

例えば:

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

ところで、ビューに注入可能なプレゼンターがあることも確認してください。単体テスト用にプレゼンターを挿入できる別のコンストラクター

于 2012-10-16T17:50:31.063 に答える