2012-09-14 130 views
1

我正在爲WinForms應用程序開發基於MVP的GUI架構,並希望使用Autofac跟蹤不同部分。我一直在考慮循環組件的依賴性,並希望在正確的方向上輕輕一推。MVP視圖/演示者註冊

該體系結構基於this後,其中視圖像我一樣被動。該視圖不會提及演示者。該視圖被傳遞給施工主持人。因此,在非DI世界中,你將與你的啓動程序:

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

好了,演示者需要了解視圖實例來完成其工作。我怎樣才能在註冊碼中表達這一點?這是我已經試過:

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); 

但是這樣一來,我需要記住創建演示實例。不過,我想在註冊表中表示,如果我請求一個IMainView實例,MainPresenter應該啓動。但

任何提示,嘲笑或嘲弄的笑聲怎麼....歡迎

回答

0

我想你應該能夠解決這樣說:既然你說的觀點不需要註冊沒有財產注入了主持人和視圖參照演示者和構造器注入被認爲是最佳實踐中Autofac:

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

注入視圖到演示通過構造和發佈爲只讀屬性:

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; } 
+0

由於設置屬性!我喜歡展示'mainPresenter.View'的想法。我一直盯着解決容器中的View和Presenter的問題。 – Moelgaard

+0

不客氣! –