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 では、文字通りインメモリからインスタンスを取得しているだけなので、これは非常に高速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 を使用することをお勧めします。IOC の方がテストしやすく、他のすべての依存関係が登録されている方法と一貫性があるためです。使用しない正当な理由はありません。

于 2013-05-28T14:36:16.630 に答える