2

ここの myList のように、サービススタックの自己ホスト型サーバーにいくつかの「グローバル」変数が必要です。

    public partial class Main : Form
    {
        AppHost appHost;

        public Main()
        {
            InitializeComponent();

            appHost = new AppHost();
            appHost.Init();
            appHost.Start(ListeningOn);

            appHost.Plugins.Add(new ProtoBufFormat());
            appHost.ContentTypeFilters.Register(ServiceStack.Common.Web.ContentType.ProtoBuf, (reqCtx, res, stream) => ProtoBuf.Serializer.NonGeneric.Serialize(stream, res), ProtoBuf.Serializer.NonGeneric.Deserialize);
        }

        /// <summary>
        /// Create your ServiceStack http listener application with a singleton AppHost.
        /// </summary> 
        public class AppHost : AppHostHttpListenerBase
        {
            public int intAppHost;
            /// <summary>
            /// Initializes a new instance of your ServiceStack application, with the specified name and assembly containing the services.
            /// </summary>
            public AppHost() : base("CTServer HttpListener", typeof(MainService).Assembly) { }

            /// <summary>
            /// Configure the container with th e necessary routes for your ServiceStack application.
            /// </summary>
            /// <param name="container">The built-in IoC used with ServiceStack.</param>
            public override void Configure(Funq.Container container)
            {
                Routes
                  .Add<ReqPing>("/ping");
            }
        }
    }

public class MainService : Service
{
    public RespPing Any(ReqPing request)
    {
        // Add a value to a global list here
        myList.Add(myData);

        RespPing response = new RespPing();
        return response;
    }   
}

どこで myList を定義する必要があり、その場所からどのようにアクセスできますか? そして、どうすればスレッドセーフな方法でそれを行うことができますか? この場合の機能は、受信した特定の値を保存し、この値がすでにリストにあるかどうかを別のインスタンスでチェックすることです。これはインスタンス間でデータを共有する適切な方法ですか、それとも別の道をたどるべきですか?

ありがとう!マティア

4

1 に答える 1

2

これはServiceStackとは何の関係もありません。ServiceStack サービスは、登録された依存関係で毎回自動接続される単純な C# クラスであるためです。

したがって、通常の C# ルールが適用されます。グローバルの場合は静的にすることができますが、ASP.NET と HttpListener はマルチスレッドであるため、アクセスを保護する必要があります。たとえば、次のようになります。

public class MainService : Service
{
    static List<MyData> myList = new List<MyData>();

    public RespPing Any(ReqPing request)
    {
        // Add a value to a global list here
        lock(myList) myList.Add(myData);

        RespPing response = new RespPing();
        return response;
    }   
}

別の方法は、シングルトンの依存関係を登録し、毎回それを必要とするすべてのサービスに自動配線することです。次に例を示します。

通常の依存

public class GlobalState
{
    List<MyData> myList = new List<MyData>();

    public void AddData(MyData myData)
    {
        lock(myList) myList.Add(myData);
    }
}

AppHost

public override void Configure(Funq.Container container)
{
    //All Registrations and Instances are singleton by default in Funq
    container.Register(new GlobalState()); 
}

サービス

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

    public RespPing Any(ReqPing request)
    {
        // Add a value to a global list here
        GlobalState.AddData(myData);

        RespPing response = new RespPing();
        return response;
    }   
}
于 2013-04-27T15:45:38.933 に答える