簡體   English   中英

MVP視圖/演示者注冊

[英]MVP view/presenter registration

我正在為WinForms應用程序開發基於MVP的GUI體系結構,並希望使用Autofac來跟蹤不同的部分。 我一直遇到循環組件依賴關系,並希望朝着正確的方向輕輕地推動。

該架構基於這篇文章,在文章中,View與我一樣被動。 視圖不引用演示者。 視圖將在構造時傳遞給Presenter。 因此,在非DI世界中,您將使用以下代碼啟動程序:

var MainView = new MainView();
var mainPresenter = new MainPresenter(mainView, new DataRepository());
Application.Run(mainView);

好的,因此Presenter需要了解View實例才能完成其工作。 如何在注冊碼中表達出來? 這是我嘗試過的:

builder.RegisterType<MainPresenter>().PropertiesAutowired().SingleInstance();
builder.RegisterType<MainView>().As<IMainView>().PropertiesAutowired().SingleInstance();

然后在Program.cs中:

var mainPresenter = Container.Resolve<MainPresenter>();
Application.Run(Container.Resolve<IMainView>() as MainView);

但是通過這種方式,我需要記住創建Presenter實例。 但是,我想在注冊中表示,如果我請求IMainView實例,則應將MainPresenter付諸行動。 但是...

任何暗示,嘲弄或嘲笑的歡迎

我認為您應該可以這樣解決:注冊演示者和視圖而無需注入屬性,因為您說視圖不需要引用演示者,並且構造函數注入被認為是Autofac的最佳實踐:

builder.RegisterType<MainPresenter>().SingleInstance();
builder.RegisterType<MainView>().As<IMainView>();

通過構造函數將視圖注入到presenter中,並將其發布為只讀屬性:

public class MainPresenter
{
  // Private variables

  private readonly IMainView _view;

  // Constructor

  public MainPresenter(IMainView view)
  {
    _view = view;
  }

  // Properties

  public IMainView View
  {
    get { return _view; }
  }
}

然后,您通過一個解決方案啟動應用程序:

var mainPresenter = Container.Resolve<MainPresenter>();
Application.Run(mainPresenter.View as Form);

最后,如果以后發現您需要從視圖到演示者的引用,我認為您必須在視圖上使用屬性注入以避免循環引用異常。 然后,您可以像這樣注冊視圖:

builder.RegisterType<MainView>().As<IMainView>().PropertiesAutowired(PropertyWiringFlags.AllowCircularDependencies);

並為視圖提供由Autofac設置的讀/寫屬性

public MainPresenter Presenter { get; set; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM