C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/04/22 23:28
当初の予定では、一元的なエラーハンドリングの方法を紹介することになっていましたが、その前に、サービスのカスタム属性として適用する独自のビヘイビアを定義する方法を紹介します。
コンフィギュレーションやコードから、サービスホストに対してビヘイビアを適用する方法は、こちらの「独自のビヘイビアを定義する」という記事を参照してください。

ビヘイビアには、サービス ビヘイビア、エンドポイント ビヘイビア、コントラクト ビヘイビア、オペレーション ビヘイビアの4種類がありますが、このうち、エンドポイント ビヘイビア以外のビヘイビアは、カスタム属性として定義することもできます。
例えば、サービス ビヘイビアは IServiceBehavior インターフェイス (System.ServiceModel.Description) を実装するクラスとして定義し、更に Attribute クラス (System) を継承させます。


以下に、サービス ビヘイビアの実装例を示します。

using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;

[AttributeUsage(AttributeTargets.Class)]
public sealed class HelloWorldBehaviorAttribute : Attribute, IServiceBehavior
{
    private bool silent;

    public bool Silent
    {
        get
        {
            return this.silent;
        }
        set
        {
            this.silent = value;
        }
    }

    public HelloWorldBehaviorAttribute()
    {
        this.silent = false;
    }

    void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
    {
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        if (this.silent)
        {
            return;
        }

        serviceHostBase.Opened +=
            delegate
            {
                Console.WriteLine("Hello World !");
            };
    }

    void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }
}

このサービス ビヘイビアを適用すると、前回と同じく、サービス ホストのオープン時にコンソールへ "Hello World !" と出力します。

以下に、適用例を示します。

[HelloWorldBehavior(Silent = false)]
public sealed class Service1 : IService1
{
    /*...*/
}
タグ: .NET C# WCF











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/124-ad82642e