你在想这个。 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
谢谢你解释。 –