2013-05-28 27 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

谢谢你解释。 –