2011-01-20 18 views
6

Ho alcuni comportamenti di servizio per i servizi WCF che voglio semplicemente registrare; non c'è configurazione. Ho pensato ho potuto saltare creando un discendente BehaviorExtensionElement ogni volta utilizzando generici:È possibile un BehaviorExtensionElement generico?

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

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

E in Web.config:

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

WcfService1.MyBehavior esiste, implementa IServiceBehavior, ed è stato testato.

Ma quando mi riferisco < myBehavior2/> nella sezione comportamento del file di configurazione, ottengo:

Si è verificato un errore durante la creazione del gestore della sezione di configurazione per System.ServiceModel/comportamenti: elemento Extension 'myBehavior2' non può essere aggiunto a questo elemento . Verificare che l'estensione sia registrata nella raccolta di estensioni a system.serviceModel/extensions/behaviorExtensions. Nome parametro: elemento

Tutto funziona se creo un discendente BehaviorExtensionElement non generico, che posso fare. Ma ora mi dà fastidio. ;)

risposta

2

Purtroppo questo non è possibile con i file di configurazione, almeno non in modo affidabile.

La ragione è che se si dispone di una classe generica class A<T> e un parametro di classe class B il quadro non creerà una classe A<B> fino si dichiara un tipo di A<B> usandolo. Il nome nel formato A`1 [[B, Assm]] è solo il nome che viene creato in fase di esecuzione: indica la "A" generica che prende 1 parametro creato con i seguenti tipi. Non è uno spunto per una fabbrica di tipi - che è ciò che ti serve per quello che stai facendo. Quindi tu potresti essere in grado di farlo funzionare se sei fortunato e A<B> è stato dichiarato, ma io non ci farei affidamento.

Questo è, credo, risolto nella serializzazione del contratto dati utilizzata dalle parti successive del framework, ma la configurazione è obsoleta.Se si guarda a XAML non v'è la possibilità di utilizzare un tipo di argomenti con un tipo:

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

Nota che questa è un'istruzione esplicita a una fabbrica di tipo - cosa che il parser config fa non hanno.

Quindi purtroppo questo ti lascia con la spesa di dichiarare un tipo concreto per ogni interno - ma non è un sacco di lavoro:

public class MyBehaviorExtensionElement : 
     SimpleBehaviorExtensionElement<MyBehavior> {} 

E il lato positivo che rende il vostro file di configurazione più leggibile.

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

Sì, è possibile.

Suppongo che il motivo per cui l'eccezione venga generata è perché gli elementi di comportamento vengono aggiunti WCF extensions without including the assembly version.

Quando si specifica il tipo di comportamento, versione, Cultura e PublicKeyToken attributi MUST essere aggiunti pure. Si prega di notare anche che DEVE DEVE essere esattamente uno spazio dopo ogni, (virgola), e gli attributi DEVONO apparire nell'ordine sopracitato.

Quindi, nel tuo esempio, seguente dovrebbe funzionare:

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

Questo non è il caso. Ho degli elementi di estensione del comportamento di lavoro che specificano il tipo senza una versione. – TrueWill

+0

@TrueWill: dubito che uno di quegli elementi di lavoro sia effettivamente generico. –

+0

hai provato questo e riuscito a farlo funzionare con un'estensione generica? – TrueWill

Problemi correlati