1

現在、必要なたびにキャッシュしServiceChannelFactoryて新しいものを作成しています。がガベージコレクターによって破棄されることServiceChannelを期待していました。ServiceChannelsただし、ファクトリは各チャネルへの参照を保持しているため、 を呼び出したときにチャネルを閉じることができますServiceFactoryChannel.Close()。これにより、すべてが機能しなくなるまで、多くの古いチャネルが生き続けます。

ファクトリをキャッシュし、ガベージ コレクターにチャンネルを破棄させるにはどうすればよいですか?

私のコードは次のようになります。

public class ServiceChannel
{
    // Returns a ServiceChannel
    public static TService Get<TService>()
    {
        var factory = GetChannelFactory<TService>();
        string url = GetEndpoint<TService>();
        var endPoint = new EndpointAddress(url);
        return factory.CreateChannel(endPoint);
    }

    // Returns a ServiceChannelFactory, preferably from the cache
    public static ChannelFactory<TService> GetChannelFactory<TService>()
    {
        var cacheKey = string.Format("MyProduct.Library.ServiceChannel.GetChannelFactory<{0}>()", typeof(TService));
        var cache = HttpRuntime.Cache;
        var factory = cache[cacheKey] as ChannelFactory<TService>;
        if (factory == null)
        {
            factory = GetChannelFactoryUncached<TService>();
            cache.Insert(cacheKey, factory);
        }
        return factory;
    }
}
4

1 に答える 1

1

Autofac/Unity/Ninject のような IoC コンテナーを使用するか、非常に基本的で高速なコンテナーには DynamoIOC を使用できます。

コンテナーを設定するときは、ServiceChannelFactory への参照を 1 つにします。(サービス IMyService に対して) IServiceChannel を作成するときに、それも登録します。

ただし、IServiceChannel.Faulted イベントが発生した場合は、イベントを閉じて破棄し、再作成して、IoC コンテナーに追加し直す必要があることに注意してください。このようにして、呼び出し元がサービスへのアクセスを必要とするときはいつでも、障害のない状態になります。

于 2012-05-24T14:22:24.820 に答える