簡體   English   中英

ASP.NET MVP注入服務依賴性

[英]ASP.NET MVP Injecting Service Dependency

我有一個ASP.NET頁面,它實現了我的視圖,並在頁面構造器中創建了演示者。 Phil Haack的帖子提供被用作起點 ,我只是從帖子中的例子來說明問題。

public partial class _Default : System.Web.UI.Page, IPostEditView {

    PostEditController controller;
    public _Default()
    {
         this.controller = new PostEditController(this, new BlogDataService());
    }
}

注入BlogDataService實例的最佳方法是什么? 我發現的示例在Page類中使用了屬性,該屬性標記有注入框架解析的屬性。

但是,我更喜歡使用構造函數方法進行測試。

有沒有人有輸入或者可能鏈接到上面的良好實現。 我更喜歡Ninject,但只要它流利,StructureMap或Windsor會很好。

感謝您的任何反饋。

在我們自己開發的MVP框架中,我們有一個所有Pages繼承自的類型化基類。 類型必須是Presenter類型(我們的基本演示者類)

在基類中,我們然后使用IoC容器初始化控制器。

示例代碼:

public class EditPage : BasePage<EditController> {
}

public class EditController : Presenter {
 public EditController(IService service) { }
}

public class BasePage<T> : Page where T: Presenter
{
 T Presenter { get; set; }
 public BasePage() { 
  Presenter = ObjectFactory.GetInstance<T>(); //StructureMap
 }
}

希望這可以幫助!

如果使用Microsoft ServiceLocator ,則可以應用服務定位器設計模式並向容器請求該服務。

在你的情況下,它看起來像這樣:

public partial class _Default : System.Web.UI.Page, IPostEditView {

    PostEditController controller;
    public _Default()
    {
         var service = ServiceLocator.Current.GetInstance<IBlogDataService>();
         this.controller = new PostEditController(this, service);
    }
}

ServiceLocator具有Castle Windsor和StructureMap的實現。 不確定Ninject,但為新的IoC創建ServiceLocator適配器是微不足道的。

我還沒有看到在webforms上進行構造函數注入的通用方法。 我假設它可能通過PageFactory實現,但由於現在大多數人正在轉向MVC而不是webforms,這可能不會發生。

但是, autofac (我喜歡的DI容器)有一個用於ASP.NET WebForms集成模塊,它可以在沒有屬性的情況下進行屬性注入 - 您的代碼看起來像這樣:

public partial class _Default : System.Web.UI.Page, IPostEditView {

    public IBlogDataService DataService{get;set;}
    public _Default()
    {
    }
}

我知道這並沒有特別解決你使用構造函數注入的願望,但這是我所知道的最接近的。

暫無
暫無

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

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