2011-01-20 19 views
6

登録したいWCFサービスに対していくつかのサービス動作があります。設定はありません。私はジェネリックを使用してBehaviorExtensionElementの子孫を毎回作成スキップでき考え出し:一般的なBehaviorExtensionElementは可能ですか?

public class SimpleBehaviorExtensionElement<TBehavior> : BehaviorExtensionElement 
    where TBehavior: new() 
{ 
    protected override object CreateBehavior() 
    { 
     return new TBehavior(); 
    } 

    public override Type BehaviorType 
    { 
     get { return typeof(TBehavior); } 
    } 
} 

そして、Web.configファイルで:

<behaviorExtensions> 
    <add name="myBehavior2" 
    type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior, 
     WcfService1]], WcfService1"/> 
</behaviorExtensions> 

WcfService1.MyBehaviorは、存在するIServiceBehaviorを実装し、テストされています。

しかし、私は、configファイルの動作セクションに< myBehavior2/>を参照するとき、私は得る: 拡張要素:

エラーが system.serviceModel /行動のための 構成セクションハンドラを作成発生しました'myBehavior2'は をこの要素に追加できません。 拡張子が 拡張コレクションに system.serviceModel/extensions/behaviorExtensionsに登録されていることを確認します。 パラメータ名:element

私ができる一般的でないBehaviorExtensionElementの子孫を作成するとすべて動作します。しかし今、それは私をバグします。 ;)

答えて

2

残念ながら、これは少なくともない信頼性の高い方法で、設定ファイルでは不可能です。

理由は、ジェネリッククラスclass A<T>とクラス・パラメータclass Bを持っている場合は、それを使用してA<B>の型を宣言するまで、フレームワークは、クラスA<B>を作成しないということです。 A`1 [[B、Assm]の形式の名前は、実行時に作成される名前に過ぎません。以下の型で作成された1つのパラメータを取る汎用の "A"を意味します。タイプファクトリへの合図ではありません。これは、あなたがしていることに必要なものです。だからあなたはかもしれないあなたは幸運であり、A<B>が宣言されたことが起こるが、私はそれに頼ることはありません。

これは、フレームワークの後半部分で使用されるデータコントラクトのシリアル化で修正されていますが、設定は古いと思います。あなたはXAMLを見れば種類と型引数を使用する機能があります:

<scg3:Dictionary x:TypeArguments="x:String, x:Object"> 

注これは型工場への明示的な命令である - 設定パーサがないを持っている何か。

だから、悲しいことに、これは各拡張機能の具体的なタイプを宣言する費用が残ります - しかし、それは多くの作業ではありません。

public class MyBehaviorExtensionElement : 
     SimpleBehaviorExtensionElement<MyBehavior> {} 

とプラス側のそれはあなたの設定ファイルが読みやすくなります。

<behaviorExtensions> 
    <add name="myBehavior" 
    type="BehaviorTest.MyBehaviorExtensionElement, ServiceLibrary"/>  
</behaviorExtensions> 
0

はい、可能です。

例外がスローされる理由は、振る舞いの要素が追加されていると思います。WCF extensions without including the assembly versionです。

行動の種類、 バージョン文化MUSTも同様に追加される属性 なPublicKeyTokenを指定します。 は必ずそれぞれ1つのスペース(カンマ)にしてください。は必ず上記の順序で表示されます。はMUSTです。

だから、あなたの例では、次のように動作するはずです:

<behaviorExtensions> 
    <add name="myBehavior2" 
     type="WcfService1.SimpleBehaviorExtensionElement`1[[WcfService1.MyBehavior, WcfService1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], WcfService1" /> 
</behaviorExtensions> 
+0

そうではありません。バージョンなしでタイプを指定する作業動作拡張要素があります。 – TrueWill

+0

@TrueWill:私は、これらの作業要素のどれかが実際には一般的なものであるとは思わない。 –

+0

これを試しても、正常に拡張機能を使用できるようになったのですか? – TrueWill

関連する問題