3

给定 ServiceStack 中的以下服务类,

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

我将如何访问someOtherClassInstance?我很困惑在特定状态下返回对象的最佳做法是什么?我知道从 HelloWorldService 中访问静态类对象很容易,但是其他保持状态的实例呢?我很难相信最好的解决方案是 IoC。还有更好的方法吗?如何传递要使用的参考?有什么建议和想法吗?

非常感谢!

4

1 回答 1

2

你想多了。ServiceStack 中的AService只是一个普通的 C# 实例,它会在每个请求时启动和填充。

默认情况下,内置 Funq 将所有内容注册为单例,因此当您注册实例时,例如:

container.Register(new GlobalState());

并在您的服务中引用它:

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

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

在幕后它总是注入同一个实例,在 Funq 中这非常快,因为它实际上只是从 in-memory 中检索实例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;
    }
}

或者你想这样做。我建议使用 IOC,因为它更具可测试性,并且与所有其他依赖项的注册方式一致,而且我真的没有理由不这样做。

于 2013-05-28T14:36:16.630 回答