0

静的な並行辞書にアクセスするために使用される静的クラスがあります。

public static class LinkProvider
{
    private static ConcurrentDictionary<String, APNLink.Link> deviceLinks;
    static LinkProvider()
    {
        int numProcs = Environment.ProcessorCount;
        int concurrencyLevel = numProcs * 2;
        deviceLinks = new ConcurrentDictionary<string, APNLink.Link>(concurrencyLevel, 64);
    }


    public APNLink.Link getDeviceLink(string deviceId, string userId)
    {
        var result = deviceLinks.First(x => x.Key == deviceId).Value;
        if (result == null)
        {      
           var link = new APNLink.Link(username, accountCode, new APNLink.DeviceType());
           deviceLinks.TryAdd(deviceId, link);
           return link;

        }
        else
        {
            return result;
        }
    }


    public bool RemoveLink(string deviceId)
    {
        //not implmented
        return false;
    }
}

asp.net のコントローラーでこのクラスを使用するにはどうすればよいですか

つまり行きたい:

LinkProvider provider;
APNLink.Link tmpLink = provider.getDeviceLink(id, User.Identity.Name);
//use my link

バックグラウンド。ディクショナリは、asp.net Web API プログラムの状態/要求間のリンク オブジェクトを保存するために使用されます。そのため、サービスがリンクを使用する必要がある場合、サービスはリンク プロバイダーにそのリンクを検索するように要求し、リンクがない場合は作成する必要があります。したがって、すべての http リクエストで同じインスタンスに辞書オブジェクトが必要です。

4

1 に答える 1

3

したがって、すべての http リクエストで同じインスタンスに辞書オブジェクトが必要です

次に、staticクラスを使用し、すべてのメソッドstaticも作成して、次の構文を使用して呼び出すことができるようにします。

APNLink.Link tmpLink = LinkProvider.getDeviceLink(id, User.Identity.Name);

そうは言っても、ASP.Net アプリケーションのメモリ内静的変数は常に安全に使用できるとは限らないことに注意する必要があります。これは、アプリケーションがステートレスではなく、アプリケーション プールがリサイクルされた場合にディクショナリが再インスタンス化されるためです。 .

于 2014-03-11T12:22:43.957 に答える