2009-01-11 52 views
1

我在嘗試將Autofac集成到現有的ASP.NET Web應用程序中。在ASP.NET中使用Autofac和MVP模式

頁面遵循MVP模式。每個頁面都爲演示者實現了視圖和委派功能。視圖通過構造函數注入到Presenter中。

我能夠註冊Presenter和View並且頁面加載正常,但是當回發發生時,視圖上的用戶控件爲空。看起來Autofac創建了一個新的頁面實例給主持人,而不是給它實例實例頁面實例。有沒有辦法讓頁面實例註冊Autofac?

有沒有人使用Autofac與ASP.NET和MVP?

謝謝!

回答

0

我想出了一個解決方案。基本上,你會在Page_PreInit事件期間註冊頁面實例,然後調用容器來注入依賴關係。防爆。

public partial class IOCTest : System.Web.UI.Page, IIOCTestView 
{ 

    protected void Page_PreInit(object sender, EventArgs e) 
    { 
     var containerProviderAccessor = (IContainerProviderAccessor)HttpContext.Current.ApplicationInstance; 
     var containerProvider = containerProviderAccessor.ContainerProvider; 

     var builder = new ContainerBuilder(); 
     builder.Register(this).ExternallyOwned().As<IIOCTestView>(); 

     builder.Build(containerProvider.RequestContainer); 

     containerProvider.RequestContainer.InjectProperties(this); 
    } 

    public IOCTestPresenter Presenter { get; set; } 

我不確定是否有更好的方法,但這似乎工作。

2

有一個更好的方法。首先,啓用the Web integration module。這將啓用自動屬性注入實例。

由於您的演示需要在其構造的觀點,你的頁面應該採取一個主持人工廠,而不是主持人本身的依賴。

所以,首先你需要演示的工廠,這是必要的參數的委託:

public delegate IOCTestPresenter IOCTestPresenterFactory(IIOCTestView view); 

此委託必須演示構造函數的參數(類型和名稱)匹配:

public class IOCTestPresenter 
{ 
    public IOCTestPresenter(IIOCTestView view) 
    { 
    } 
} 

在您的視圖中,添加一個接收出廠委託的屬性,並使用委託來創建演示者:

public partial class IOCTest 
{ 
    public IOCTestPresenterFactory PresenterFactory {get;set;} 

    protected void Page_Load(object sender, EventArgs e)  
    { 
      var presenter = PresenterFactory(this); 
    } 
} 

在您的容器設置中,您必須進行以下注冊:

builder.Register<IOCTestPresenter>().FactoryScoped(); 
builder.RegisterGeneratedFactory<IOCTestPresenterFactory>();