コードブロックを受け取る WCF クライアント・改

WCF で、チャネルを開閉するコードを毎回書くのが面倒なので、ヘルパークラスを作って利用していました。

でも、「これだとエンドポイント決め打ちだよね〜、構成ファイルでも指定したいよね〜」となったので、ちょびっと改良。

public class ChannelProvider<TChannel>
    where TChannel : class
{
    // チャネル作成用デリゲート
    private Func<TChannel> CreateChannel;

    public ChannelProvider(string endpointConfigurationName)
    {
        this.CreateChannel = () =>
        {
            return new ChannelFactory<TChannel>(endpointConfigurationName)
                .CreateChannel();
        };
    }

    public ChannelProvider(Binding binding, string remoteAddress)
    {
        this.CreateChannel = () =>
        {
            return new ChannelFactory<TChannel>(binding, remoteAddress)
                .CreateChannel();
        };
    }

    public void Execute(Action<TChannel> block)
    {
        TChannel channel = this.CreateChannel();
        block(channel);
        ((IChannel)channel).Close();
    }

    public TResult Execute<TResult>(Func<TChannel, TResult> block)
    {
        TChannel channel = this.CreateChannel();
        try
        {
            return block(channel);
        }
        finally
        {
            ((IChannel)channel).Close();
        }
    }
}

使い方は前回と同じ。あえて今回のポイントをあげるとしたら、チャネルを生成するクロージャを保持しているところかな。

最近また Windows Azure を触るようになったので、.NET Framework を素で使いつつ、ちょっと楽をするためにヘルパークラスを作成して使うような開発スタイルを模索しています。クラウドだと CPU 使用時間が費用に直結するから、できるだけ自分の書くコードと .NET Framework の間に処理を挟みたくないので。