2013-05-28 69 views
3

鑑於ServiceStack以下服務類,ServiceStack,如何訪問業務邏輯Pocos?

public class HelloWorldService: Service 
{ 
    public string Get(HelloWorldRequest request) 
    { 
     return someOtherClassInstance; 
    } 
} 

我怎麼會訪問someOtherClassInstance?我對最佳實踐是否在特定狀態下返回對象感到困惑?我理解它很容易從HelloWorldService中訪問靜態類對象,但其他實例如何保持狀態?我非常難以相信最好的解決方案是IoC。有更好的方法嗎?我如何傳遞參考以供使用?任何建議和想法?

非常感謝!

回答

2

你在想這個。 ServiceStack中的Service只是一個普通的C#實例,它在每個請求中都被啓動並填充。

默認情況下,內置的Funq登記的一切作爲一個單身,所以,當你註冊一個實例如:

container.Register(new GlobalState()); 

,並在服務中引用它:

public class HelloWorldService: Service 
{ 
    public GlobalState GlobalState { get; set; } 

    public string Get(HelloWorld request) 
    { 
     return GlobalState.SomeOtherClassInstance; 
    } 
} 

它的幕後總是注入相同的實例,而在Funq中,這非常快,因爲它實際上只是從內存中檢索實例Dictionary

但是,如果出於某種原因你不喜歡這種做法不是一種服務仍然只是一個C#類,所以你可以使用一個靜態屬性:

public class HelloWorldService: Service 
{ 
    public static GlobalState GlobalState = new GlobalState { ... }; 

    public string Get(HelloWorld request) 
    { 
     return GlobalState.SomeOtherClassInstance; 
    } 
} 

或辛格爾頓:

public class HelloWorldService: Service 
{ 
    public string Get(HelloWorld request) 
    { 
     return GlobalState.Instance.SomeOtherClassInstance; 
    } 
} 

或其他你想要做的。我建議使用國際奧委會,因爲它更易於測試,並且與所有其他依賴項的登記方式保持一致,而且我也沒有看到有充分的理由不這樣做。

+0

感謝您的意見,但我很困惑如何在您的第一個代碼片段中檢索globalstate實例。我不需要通過服務基類容器中的tryresolve ()來訪問它嗎?還是Funq自動解決我在從Service派生的類中設置的公共屬性? –

+0

這是國際奧委會的主要職能之一,即它自動連線/自動注入您的服務的公共屬性與所有註冊的依賴關係。 – mythz

+0

謝謝你解釋。 –