2013-04-09 88 views
1

這是如何工作的?我已閱讀文檔,但希望獲得更多信息。服務堆棧IRequiresHttpRequest模式

從閱讀文檔我明白,當我的DTO實現IRequiresHttpRequest,那麼DTO的屬性將不會自動填充,但在我的DTO中,我現在可以訪問HttpRequest對象,所以我可以將我的DTO更改爲'get'從請求對象中抽取事物的屬性。

什麼是注入HttpRequest到我的DTO?文檔建議服務棧在後臺執行此操作,但是我只能在註冊自定義請求綁定並手動注入HttpRequest對象時才能使其工作。

RequestBinders.Add(typeof(MyDto), httpReq => { 
    var dto = new MyDto(); 
    dto.HttpRequest = httpReq; 
    return dto; 
}); 

問題1:IRequiresHttpRequest的注入究竟意味着什麼工作?

問題2:有沒有辦法獲得對HttpRequest對象的訪問權限,以便我的DTO可以支持自定義的'get'屬性,仍然有服務棧運行它自動映射?例如:

public class MyDto 
    : IRequiresHttpRequest 
{ 
    public Int32 AutoMappedProperty1 { get; set; } 
    public Int32 AutoMappedProperty2 { get; set; } 
    public Int32 AutoMappedProperty3 { get; set; } 
    public Int32 AutoMappedProperty4 { get; set; } 

    public Int32 CustomMappedProperty { get { return customMappedProperty; } } 

    IHttpRequest httpRequest; 

    public IHttpRequest HttpRequest 
    { 
     get 
     { 
      return httpRequest; 
     } 
     set 
     { 
      httpRequest = value; 

      // lets say this searches the query string for a variety of 
      // different keys, and then maps one of them of 
      // CustomMappedProperty based upon a specific set of rules 
      customMappedProperty = [...] 
     } 
    } 
} 

在上述情況下,我定義CustomMappedProperty如何被填充,但我還是想服務棧先走,並映射所有「set'-能性能。有沒有辦法做到這一點?我可以手動調用服務堆棧dto映射器嗎?

回答

3

您閱讀了關於IRequiresHttpRequest的哪些文檔? IRequiresHttpRequest與IRequiresRequestContext的作用相同,僅用於裝飾服務驗證程序告訴ServiceStack它需要訪問並注入當前的IHttpRequest或IRequestContext。

Custom Serialization/Deserialization wiki的僅提到IRequiresRequestStreamIRequiresSoapMessage可以請求的DTO用於發信號到ServiceStack跳過處理所述請求體,並允許您自己手動反序列化請求。

+0

https://github.com/ServiceStack/ServiceStack/wiki/Access-HTTP-specific-features-in-services – sungiant 2013-04-09 14:01:38

+0

該頁面只提到IRequiresRequestContext,我必須假設IRequiresHttpRequest將以相同的方式注入。 – sungiant 2013-04-09 14:02:46

+0

沒問題,但是會談到在您的服務中注入請求上下文,而不是請求DTO和跳過反序列化。我的回答解釋了差異。 – mythz 2013-04-09 14:09:40