2

.NET Web サービスでデータを永続化するためのソリューションは何ですか?

私はウェブサービスを持っています。Web サービスに ID を与えると、これは正しいオブジェクトを返します。

        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "/GetMyObject?id={id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        MyObject GetMyObject(string id);

データベースを使いたくない。オブジェクトのコレクションを「メモリ」に保持したいと思います。だから私はこのような私のWebサービスで単純なオブジェクトを作成することにしました

    public class Service : IService
    {
        List<MyObject> list = new List<MyObjec>();

        public Service()
        {
            list.Add(new MyObject() { Id = 1, Data = ...} );
            list.Add(new MyObject() { Id = 2, Data = ...} );
            list.Add(new MyObject() { Id = 3, Data = ...} );
            list.Add(new MyObject() { Id = 4, Data = ...} )
            ...
        }

        public MyObject GetMyObject(string id)
        {
            // code to get my object from the list
            return myObject;
        }
}

動作しますが、Web サービスを呼び出すたびにコンストラクターが呼び出されます。このリストを一度初期化し、後で変更を適用したいと考えています。リストを初期化して保持するにはどうすればよいですか?

4

3 に答える 3

8

静的コレクションを使用できます。

private static List<MyObject> list = new List<MyObjec>();

もちろん、これはマルチスレッド アプリケーションであり、このコレクションに同時にアクセスできる可能性があるため、コレクションへのアクセスを同期する必要があります。または、.NET 4.0 を使用している場合は、単純にスレッド セーフを使用しますConcurrentBag<T>

private static ConcurrentBag<MyObject> list = new ConcurrentBag<MyObjec>();

もちろん、メモリ内構造を使用してデータを保存することにより、データの寿命は基本的に Web アプリケーションの寿命に結びついていることに注意してください。また、IIS はいつでもアプリケーション ドメインをリサイクルする可能性があるため (一定期間の非アクティブ状態、特定の CPU/メモリしきい値に達したとき)、メモリに保存したすべてのものが無効になります。

ちなみに、その方法を使用する場合は、Web サービスを再コンパイルするたびに、これが非常に頻繁に発生するように準備してください。

ええ、このテキストの壁はすべて、データをインメモリ以外の場所に永続化するように指示するものです:-) さまざまな形式のファイル、データベース、組み込みデータベースなど、さまざまな可能性があります...

于 2012-06-27T16:33:40.733 に答える
3

または、サービスをシングルトンにすることもできます

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
                 ConcurrencyMode = ConcurrencyMode.Single)]
class Service
...

しかし、この方法は将来大きな問題を引き起こします。メモリ内には何も格納しないでください。その場合、状態をアプリケーションに埋め込みます。これは、高い信頼性とスケーラビリティを実現するために必要な膨大な量の作業につながります。無状態、無痛。

于 2012-06-27T16:36:18.327 に答える
0

WCF にはインスタンス管理が組み込まれています。

于 2012-06-27T16:36:24.723 に答える