2011-01-20 12 views
6

Tengo algunos comportamientos de servicio para los servicios de WCF que solo quiero registrar; no hay configuración Pensé que podía saltar la creación de un descendiente BehaviorExtensionElement cada vez mediante el uso de los genéricos:¿Es posible un BehaviorExtensionElement genérico?

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

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

Y en Web.config:

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

WcfService1.MyBehavior existe, implementa IServiceBehavior, y ha sido probado.

Pero cuando me refiero a < myBehavior2/> en la sección comportamiento del archivo de configuración, me sale:

Se produjo un error al crear el controlador de la sección de configuración de system.serviceModel/comportamientos: Elemento Extensión 'myBehavior2' no puede agregarse a este elemento. Verifique que la extensión esté registrada en la colección de extensiones en system.serviceModel/extensions/behaviorExtensions. Nombre Parámetro: Elemento

Todo funciona si creo un descendiente BehaviorExtensionElement no genérico, lo que puedo hacer. Pero ahora me molesta. ;)

Respuesta

2

Desafortunadamente esto no es posible con los archivos de configuración, al menos no de una manera fiable.

La razón es que si usted tiene una clase genérica class A<T> y un parámetro de clase class B el marco no creará una clase A<B> hasta que se declara un tipo de A<B> mediante el uso de la misma. El nombre en el formato A`1 [[B, Assm]] es solo el nombre que se crea en el tiempo de ejecución; significa la "A" genérica que toma 1 parámetro creado con los siguientes tipos. No es una señal para una fábrica de tipos, que es lo que necesita para lo que está haciendo. Así que podría ser capaz de hacer que esto funcione si tiene suerte y A<B> pasa a ser declarado, pero yo no confiaría en ello.

Esto es, creo, corregido en la serialización del contrato de datos que se utiliza en partes posteriores del marco, pero la configuración es antigua.Si nos fijamos en XAML existe la posibilidad de utilizar un tipo de argumentos con un tipo:

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

Nota esto es una instrucción explícita a una fábrica de tipo - algo que el analizador de configuración hace no tienen.

Así que por desgracia esto te deja con el gasto de declarar un tipo concreto para cada extensión - pero no es un montón de trabajo:

public class MyBehaviorExtensionElement : 
     SimpleBehaviorExtensionElement<MyBehavior> {} 

Y en el lado positivo que hace que su archivo de configuración sea más legible.

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

Sí, es posible.

Supongo que la razón por la que se lanza la excepción es porque se han agregado elementos de comportamiento de manera WCF extensions without including the assembly version.

Al especificar el tipo de comportamiento, Versión, Cultura y PublicKeyToken atributos MUST añadirse también. Tenga en cuenta también que no DEBE ser exactamente un espacio después de cada uno, (coma), y los atributos DEBEN aparecen en el orden mencionado anteriormente.

Así, en su ejemplo, siguiente debe funcionar:

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

No es el caso. Tengo elementos de extensión de comportamiento de trabajo que especifican el tipo sin una versión. – TrueWill

+0

@TrueWill: dudo que ninguno de esos elementos de trabajo sea genérico. –

+0

¿Has probado esto y lo has conseguido con una extensión genérica? – TrueWill

Cuestiones relacionadas