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 の間に処理を挟みたくないので。