Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

WCFサービスのプロキシクラスをPartialクラスで拡張する

Visual Studioの「サービス参照の追加」機能を使うと、WCFサービスのプロキシクラスを自動で生成してくれます。このプロキシクラスはPartialクラスなので、拡張することができます。

検証環境

Visual Studio 2008 SP1、.NET Framework 3.5 SP1

WCFサービスプロジェクト

プロジェクトテンプレートは、[Web] - [WCFサービスアプリケーション]を選択します。

IService.cs
using System.Runtime.Serialization;
using System.ServiceModel;

namespace WebService {
    [ServiceContract]
    public interface IService {
        [OperationContract]
        Hoge GetData();
    }

    [DataContract]
    public class Hoge {
        [DataMember]
        public string Foo { get; set; }

        [DataMember]
        public string Bar { get; set; }
    }
}
Service.svc.cs
namespace WebService {
    public class Service : IService {
        #region IService メンバ

        public Hoge GetData() {
            return new Hoge() { Foo = "foo", Bar = "bar" };
        }

        #endregion
    }
}

コンソールアプリケーションプロジェクト

コンソールアプリケーションプロジェクトを追加します。

サービス参照の追加

作成したWCFサービスのサービス参照を追加します。手順はリンク先を参考にしてください。
WCFのセッション機能でステートフルなWebサービスを作成する - プログラマーな日々
Webサービスは通常ステートレスですが、WCFのセッション機能を使うとステートフルなWebサービスを作成することができます。

Program.cs
using System;
using WebServiceClient.ServiceReference;

namespace WebServiceClient {
    class Program {
        static void Main(string[] args) {
            ServiceClient proxy = new ServiceClient();
            Hoge hoge = proxy.GetData();
            Console.WriteLine(hoge);
            Console.ReadKey();
        }
    }
}

実行


サービスが呼び出されていることが確認できました。

プロキシクラスの拡張

WCFサービス側でHogeクラスにメソッドを実装しても、クライアント側に生成されたHogeクラスには反映されません。そこでPartialクラスであることを利用してクライアント側のHogeクラスを拡張し、プロパティとメソッドを追加してみます。

ServiceAdditional.cs

コンソールアプリケーションプロジェクトにServiceAdditional.csを追加します。

namespace WebServiceClient.ServiceReference {
    public partial class Hoge {
        // プロパティの追加
        public string Baz {
            get { return "baz"; }
        }

        // メソッドの追加
        public override string ToString() {
            return string.Format("Foo = {0}, Bar = {1}, Baz = {2}", Foo, Bar, Baz);
        }
    }
}

実行

実行してみます。

Hogeクラスにプロパティとメソッドが追加されたことを確認できました。ServiceClientクラスも同じ要領で拡張することができます。