2012-06-02 47 views
3

我正在使用MVP模式創建ASP.NET Web窗體應用程序。我的觀點的結構是這樣的:在使用MVP構建的ASP.NET Web窗體應用程序上應用依賴注入模式

public partial class ShipperView : System.Web.UI.Page, IShipperView 
{ 
     ShipperPresenter presenter; 
     public ShipperOperationsView() 
     { 
      IShipperOperations operations = new ShipperOperations(); 
      INavigator navigator = new Navigator(); 
      presenter = new ShipperPresenter(this,operations,navigator); //Instantiating presenter 
     } 
     ... 
} 

我演講的基本結構是這樣的:

public class ShipperPresenter 
{ 
     IShipper shipperView; 
     IShipperOperations operations; 
     INavigator navigator; 
     public ShipperPresenter(IShipperView view,IShipperOperations operations,INavigator navigator) 
     { 
      shipperView = view; 
      this.operations = operations; 
      this.navigator = navigator; 
     } 
     ... 
} 

我不想使用new關鍵字來實例化我的演講,我想用解決依賴性來取代它。在依賴關係解析期間,我想將當前視圖的實例傳遞給依賴關係解析器。我嘗試了很多,但沒有得到任何滿意的答案。

使用任何IoC容器(如StructureMap,Ninject,Unity或MEF)可以解決此問題嗎?任何指針都會有很大的幫助。

+0

相關:http://stackoverflow.com/questions/8324678/c-sharp-asp-net-dependency-injection- with-ioc-container-complications – Steven

回答

2

要解決此問題,您可以使用屬性注入。

首先,寄存器ShipperOperations導航ShipperPresenter在DI容器。

然後,在您的視圖的Page_Load方法中,調用您選擇的DI容器的解析方法。

public class ShipperPresenter 
{ 
     IShipper shipperView; 
     IShipperOperations operations; 
     INavigator navigator; 
     public ShipperPresenter(IShipperOperations operations,INavigator navigator) 
     { 
      this.operations = operations; 
      this.navigator = navigator; 
     } 

     public IShipper ShipperView 
     { 
      get { return shipperView; } 
      set { shipperView = value; } 
     } 
     ... 
} 

而且認爲應該是這樣的:

public partial class ShipperView : System.Web.UI.Page, IShipperView 
{ 
     ShipperPresenter presenter; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      presenter = YourIOC.Resolve<ShipperPresenter>(); 
      presenter.ShipperView = this; 
     } 
     ... 
} 

你也可以使用一個工廠在運行時創建的主持人,同時通過它您所選擇的參數。事實上,在DI世界中,當你想用僅在運行時已知的依賴性實例化對象時,這是繼續進行的方式。在溫莎城堡有一個很好的機制,叫做typed factories

使用工廠,無需修改演示者類。如果使用溫莎,你所要做的就是註冊這個接口作爲一個類型化的工廠唯一

public interface IShipperPresenterFactory 
{ 
    ShipperPresenter Create(IShipper shipperView); 
} 

:相反,創建一個接口的工廠。對於其他DI容器,您將不得不實施一個內部使用DI容器的類來解析演示者。

視圖的Page_Load方法將隨後使用工廠這樣的:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var factory = YourIOC.Resolve<IShipperPresenterFactory>(); 
    presenter = factory.Create(this); 
} 
+0

謝謝Loupi。問題已解決。我沒有使用Castle Windser,我使用了StructureMap。我沒有嘗試你建議的另一種方法,但很快就會嘗試。再次感謝真棒回覆。 –

+0

StructureMap也有這樣的功能。它被稱爲AutoFactory。但這是相當簡陋的。 – Rookian

相關問題