Étendre WorkflowServiceHost via le fichier de configuration

À partir d'u moment où l’on en reste à utiliser des éléments de base, étendre les possibilités d’un hôte de workflow n’a rien de très compliqués. Tout peut être fait à partir du fichier de configuration de l’application. Mais si vous avez codé vos propres extensions pour WF4, les choses sont un peut plus compliquées, car, celle-ci ne sont pas accessibles via le fichier de configuration.

Mais ceci peut facilement être résolu grâce au miracle des Behavior et des extensions pour WCF ;)

Prenons par exemple un InstanceStore que vous auriez coder vous même : MyInstanceStore. Vous avez besoin que celui-ci soit ajouté à votre WorkflowServiceHost. Rien de très compliqué, il faut juste :

  1. Coder un ServiceBeahavior
  2. Coder un Element
  3. Ajouter l’élément à la liste d’extensions du fichier de configurations
  4. Associer l’extension au service

Pour coder le ServiceBehavior, on code une classe (MyInstanceStoreBahevior) qui implémente IServiceBehavior. L’ajout d’InstanceStore custom (classe de type MyInstanceStore) se faisant bien évidemment sur la méthode ApplyDispatchBehavior :

/// <summary>
/// Behavior permettant d'ajouter un MyInstanceStore au WorkflowServiceHost 
/// </summary>
public class MyInstanceStoreBehavior : IServiceBehavior
{
    private readonly InstanceStore m_InstanceStore;

    /// <summary>
    /// Constructeur
    /// </summary>
    public MyInstanceStoreBehavior()
    {
        // Instanciation de l'InstanceStore Custom
        this.m_InstanceStore = new MyInstanceStore();
    }

    public void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
        // Pas de paramètres
    }

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
    {
        // Ajout de l'instance de InstanceStore<T> au WorkflowServiceHost
        WorkflowServiceHost host = serviceHostBase as WorkflowServiceHost;
        if (host != null)
        {
            host.DurableInstancingOptions.InstanceStore = this.m_InstanceStore;
        }
    }

    public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
    {
        // Pas de validation
    }
}

Il reste alors à ajouter un ExtensionElement pour que notre Behavior soir disponible comme extension des Behaviors de base. Ce qui donne l’MyInstanceStoreElement qui permettra d’instancier des MyInstanceStoreBehavior.

/// <summary>
/// Element permettant d'ajouter l'MyInstanceStoreBehavior dans un fichier de configuration
/// </summary>
public class MyInstanceStoreElement : BehaviorExtensionElement
{
    /// <summary>
    /// Type du Behavior (MyInstanceStoreBehavior)
    /// </summary>
    public override Type BehaviorType
    {
        get { return typeof(MyInstanceStoreBehavior); }
    }

    /// <summary>
    /// Creation du Behavior de type MyInstanceStoreBehavior
    /// </summary>
    /// <returns></returns>
    protected override object CreateBehavior()
    {
        return new MyInstanceStoreBehavior();
    }
}

Arrive alors l’ajout de notre extension au fichier de configuration :

<system.serviceModel>
  <extensions>
    <behaviorExtensions>
      <add name="fileStore"
            type="MyNamespace.MyInstanceStoreElement, MyAssembly" />
    </behaviorExtensions>
  </extensions>

  <!—- ... -->

</system.serviceModel>

L’extension étant maintenant accessible, on peut l’ajouter à notre service en utilisant son nom : fileStore

<system.serviceModel>

  <!-- ... -->

  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
        <workflowIdle timeToUnload="00:00:01"/>
        <fileStore />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

Et voilà, le tour est joué, vous avez maintenant un WorkflowServiceHost utilisant une extension custom choisie via votre fichier de configuration.

Jérémy Jeanson

Comments

You have to be logged in to comment this post.