你在想這個。 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;
}
}
或其他你想要做的。我建議使用國際奧委會,因爲它更易於測試,並且與所有其他依賴項的登記方式保持一致,而且我也沒有看到有充分的理由不這樣做。
感謝您的意見,但我很困惑如何在您的第一個代碼片段中檢索globalstate實例。我不需要通過服務基類容器中的tryresolve()來訪問它嗎?還是Funq自動解決我在從Service派生的類中設置的公共屬性? –
這是國際奧委會的主要職能之一,即它自動連線/自動注入您的服務的公共屬性與所有註冊的依賴關係。 – mythz
謝謝你解釋。 –