[英]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.