Kit de ferramentas de Ruleset externo

Normalmente, quando as regras são usadas em um aplicativo de fluxo de trabalho, as regras fazem parte do assembly. Em algumas situações, convém manter o RuleSets separada do assembly de modo que eles possam ser atualizados sem recriar e implantar o assembly de fluxo de trabalho. Este exemplo permite que você gerencie e edite RuleSets em um banco de dados e acesse esses RuleSets de um fluxo de trabalho em runtime. Isso permite que a execução de instâncias de fluxo de trabalho incorpore automaticamente as alterações de RuleSet.

O exemplo do Kit de Ferramentas de RuleSet Externo contém uma ferramenta baseada no Windows Forms que você pode usar para gerenciar e editar versões de RuleSet em um banco de dados. Ele também inclui uma atividade e um serviço de host para executar essas regras.

Observação

Este exemplo requer o Microsoft SQL Server.

O Visual Studio fornece um editor RuleSet como parte do WF (Windows Workflow Foundation). Você pode iniciar este editor clicando duas vezes na Policy atividade em um fluxo de trabalho; ele serializa o objeto RuleSet definido para o arquivo .rules associado ao fluxo de trabalho (uma Policy atividade executa uma instância RuleSet no fluxo de trabalho). O arquivo .rules é compilado no assembly como um recurso quando você cria o projeto de fluxo de trabalho.

Os componentes deste exemplo incluem:

  • Uma ferramenta de interface gráfica do usuário RuleSet que você pode usar para editar e gerenciar versões do RuleSet no banco de dados.

  • Um serviço de RuleSet que é configurado no aplicativo host e acesse RuleSets de base de dados.

  • Uma ExternalPolicy atividade que solicita um RuleSet do serviço RuleSet e aplica o RuleSet ao fluxo de trabalho.

A interação dos componentes é mostrada na imagem a seguir. As seções a seguir descrevem cada componente.

Diagrama mostrando a visão geral do exemplo de Kit de Ferramentas de RuleSet Externo.

Ferramenta RuleSet

A imagem a seguir é uma captura de tela da ferramenta RuleSet. No menu Repositório de Regras , você pode carregar os RuleSets disponíveis do banco de dados e salvar RuleSets modificados de volta para o repositório. Um arquivo de configuração de aplicativo fornece uma cadeia de conexão de banco de dados para o banco de dados RuleSet. Quando você inicia a ferramenta, ela carrega automaticamente os RuleSets do banco de dados configurado.

Captura de tela mostrando o Navegador RuleSet.

A ferramenta RuleSet aplica números de versão principais e menores aos RuleSets, permitindo que você mantenha e armazene simultaneamente várias versões (a ferramenta não fornece nenhum bloqueio ou outros recursos de gerenciamento de configuração, além da funcionalidade de controle de versão). Usando a ferramenta, você pode criar novas versões do RuleSet ou excluir versões existentes. Quando você clica em Novo, a ferramenta cria um novo nome RuleSet e aplica a versão 1.0. Quando você copia uma versão, a ferramenta cria uma cópia da versão do RuleSet selecionada, incluindo as regras contidas, e atribui novos números de versão exclusivos. Esses números de versão são baseados nos números de versão dos RuleSets existentes. Você pode alterar o nome do RuleSet e os números de versão usando os campos associados no formulário.

Quando você clica em Editar Regras, o editor RuleSet é iniciado, conforme mostrado na imagem a seguir:

Captura de tela mostrando o Editor RuleSet.

Esta é uma re-hospedagem da caixa de diálogo do editor que faz parte do complemento do Windows Workflow Foundation para o Visual Studio. Ele fornece a mesma funcionalidade, incluindo o suporte do Intellisense. As regras são criadas em relação a um tipo de destino (como um fluxo de trabalho) associado ao RuleSet na ferramenta; quando você clica na caixa de diálogo Procurar na ferramenta principal, a caixa de diálogo Seletor de Fluxo de Trabalho/Tipo é exibida, conforme mostrado na Figura 4.

Fluxo de trabalho /Seleção de Tipo

Figura 4: Seletor de Fluxo de Trabalho/Tipo

Você pode usar a caixa de diálogo Seletor de fluxo de trabalho/tipo para especificar um assembly e um tipo específico dentro desse assembly. Esse tipo é o tipo de destino no qual as regras são criadas (e executadas). Em muitos casos, o tipo de destino é um fluxo de trabalho ou algum outro tipo de atividade. No entanto, você pode executar um RuleSet contra qualquer tipo .NET.

O caminho para o arquivo de assembly e o tipo name are stored with the RuleSet no banco de dados, de modo que, quando o RuleSet é recuperado do banco de dados, a ferramenta tenta carregar automaticamente o tipo de destino.

Quando você clica em OK na caixa de diálogo Seletor de Fluxo de Trabalho/Tipo , ele valida o tipo selecionado em relação ao RuleSet, para garantir que o tipo de destino tenha todos os membros referenciados pelas regras. Os erros são mostrados em uma caixa de diálogo Erros de Validação . Você pode optar por continuar com a alteração apesar dos erros ou clicar em Cancelar. No menu Ferramentas na caixa de diálogo da ferramenta principal, você pode clicar em Validar para validar novamente a versão ruleSet em relação à atividade de destino.

Captura de tela mostrando a caixa de diálogo Erros de Validação.

No menu Dados da ferramenta, você pode importar e exportar RuleSets. Quando você clica em Importar, uma caixa de diálogo de escolha de arquivo é exibida, na qual você pode selecionar um arquivo .rules. Isso pode ou não ser um arquivo criado inicialmente no Visual Studio. O arquivo .rules deve conter uma instância serializada RuleDefinitions que contenha uma coleção de condições e uma coleção de RuleSets. A ferramenta não usa a coleção de condições, mas usa o RuleDefinitions formato .rules para permitir a interação com o ambiente do Visual Studio.

Depois de selecionar um arquivo .rules, uma caixa de diálogo Seletor RuleSet será exibida. Você pode usar a caixa de diálogo para selecionar os RuleSets no arquivo que deseja importar (o padrão especifica todos os RuleSets). Os RuleSets no arquivo .rules não têm números de versão, pois o controle de versão deles em um projeto do WF é o mesmo que a versão do assembly. Durante o processo de importação, a ferramenta atribui automaticamente o próximo número de versão principal disponível (que você pode alterar após a importação); você pode ver os números de versão atribuídos na lista seletor do RuleSet .

Para cada RuleSet importa, tentativas da ferramenta de localizar o tipo associado bin \ debug no local do arquivo de .rules (se existir), com base nos membros usados no RuleSet. Se a ferramenta encontrar vários tipos de correspondência, ela tentará escolher um tipo com base em uma correspondência entre o nome do arquivo .rules e o nome do tipo (por exemplo, o Workflow1 tipo corresponde a Workflow1.rules). Se existirem várias correspondências, será solicitado que você selecione o tipo. Se esse mecanismo de identificação automática não localizar um assembly ou tipo correspondente, depois de importar, você poderá clicar em Procurar na caixa de diálogo da ferramenta principal para navegar até o tipo associado. A imagem a seguir mostra o Seletor RuleSet:

Captura de tela mostrando a caixa de diálogo Seletor de RuleSet.

Quando você clica em Exportar Dados do menu de ferramentas principal, a caixa de diálogo Seletor ruleSet é exibida novamente, da qual você pode determinar os Conjuntos de Regras do banco de dados que devem ser exportados. Quando você clica em OK, uma caixa de diálogo Salvar Arquivo é exibida, na qual você pode especificar o nome e o local do arquivo .rules resultante. Como o arquivo .rules não contém informações de versão, você só pode selecionar uma versão ruleSet com um determinado nome RuleSet.

Atividade PolicyFromService

O código da PolicyFromService atividade é simples. Funciona bem como a atividade de Policy fornecida com o WF, mas em vez de recuperar o destino RuleSet do arquivo de .rules, chama um serviço de hospedagem para obter a instância de RuleSet. Em seguida, ele executa o RuleSet na instância de atividade do fluxo de trabalho raiz.

Para usar a atividade em um fluxo de trabalho, adicione uma referência aos assemblies PolicyActivities e RuleSetService no seu projeto de fluxo de trabalho. Consulte o procedimento no final deste tópico para obter uma discussão sobre como adicionar a atividade à caixa de ferramentas.

Depois de colocar a atividade em seu fluxo de trabalho, você deve fornecer o nome do RuleSet a ser executado. Você pode inserir o nome como um valor literal ou associar a uma variável de fluxo de trabalho ou propriedade de outra atividade. Opcionalmente, você pode inserir números de versão para o RuleSet específico que deve ser executado. Se você deixar o valor padrão de 0 para os números de versão principal e secundária, o número de versão mais recente no banco de dados será fornecido automaticamente para a atividade.

Serviço de RuleSet

O serviço é responsável por recuperar a versão do RuleSet especificada do banco de dados e devolvê-la à atividade de chamada. Como discutido anteriormente, se os valores de versão principal e secundária passados na GetRuleSet chamada forem ambos 0, o serviço recuperará a versão mais recente. Neste ponto, não há cache de definições ou instâncias de RuleSet; da mesma forma, não há recursos para marcar versões de RuleSet como "implementadas" para diferenciá-las de RuleSets que estão em progresso.

O banco de dados a ser acessado pelo serviço deve ser configurado no host usando um arquivo de configuração de aplicativo.

Para executar a ferramenta

  1. A pasta que configura a tabela RuleSet usada pela ferramenta e pelo serviço contém um arquivo Setup.sql. Você pode executar o arquivo em lote Setup.cmd para criar o banco de dados Regras no SQL Express e configurar a tabela RuleSet.

  2. Se você editar o arquivo em lote ou Setup.sql e especificar para não usar o SQL Express ou para colocar a tabela em um banco de dados com um nome diferente de Rules, os arquivos de configuração do aplicativo na ferramenta RuleSet e nos projetos UsageSample deverão ser editados com as mesmas informações.

  3. Depois de executar o script Setup.sql, você pode criar a ExternalRuleSetToolkit solução e, em seguida, iniciar a ferramenta RuleSet do projeto ExternalRuleSetTool.

  4. A solução sequencial do aplicativo de console do fluxo de trabalho RuleSetToolkitUsageSample inclui um fluxo de trabalho de exemplo. O fluxo de trabalho consiste em uma PolicyFromService atividade e duas variáveis, orderValue e discount, com relação às quais o RuleSet de destino é executado.

  5. Para usar o exemplo, crie a RuleSetToolkitUsageSample solução. Em seguida, no menu principal da ferramenta RuleSet, clique em Importação de Dados e aponte para o arquivo DiscountRuleSet.rules na pasta RuleSetToolkitUsageSample. Clique na opção de menu Rule Store-Save para salvar o RuleSet importado no banco de dados.

  6. Porque o assembly de PolicyActivities é referenciado de projeto de fluxo de trabalho de exemplo, a atividade de PolicyFromService aparece no fluxo de trabalho. No entanto, ele não aparece na caixa de ferramentas por padrão. Para adicioná-lo à caixa de ferramentas, faça o seguinte:

    • Clique com o botão direito do mouse na caixa de ferramentas e selecione Escolher Itens (isso pode demorar um pouco).

    • Quando a caixa de diálogo Escolher Itens da Caixa de Ferramentas for exibida, clique na guia Atividades .

    • Navegue até o assembly PolicyActivities na solução ExternalRuleSetToolkit e clique em Abrir.

    • Verifique se a PolicyFromService atividade está selecionada na caixa de diálogo Escolher Itens da Caixa de Ferramentas e clique em OK.

    • A atividade agora deve aparecer na caixa de ferramentas na categoria Componentes RuleSetToolkitUsageSample .

  7. O serviço RuleSet já está configurado no host do aplicativo de console usando a instrução a seguir em Program.cs.

    workflowRuntime.AddService(new RuleSetService());
    
  8. Você também pode configurar o serviço no host usando um arquivo de configuração; consulte a documentação do SDK para obter detalhes.

  9. Um arquivo de configuração de aplicativo é adicionado ao projeto de fluxo de trabalho para especificar a cadeia de conexão para o banco de dados a ser usado pelo serviço. Essa deve ser a mesma cadeia de conexão usada pela ferramenta RuleSet, que aponta para o banco de dados que contém a tabela RuleSet.

  10. Agora você pode executar o RuleSetToolkitUsageSample projeto como faria com qualquer outro aplicativo de console de fluxo de trabalho. Pressione F5 ou Ctrl+F5 no Visual Studio ou execute o arquivo RuleSetToolkitUsageSample.exe diretamente.

    Observação

    Você deve fechar a ferramenta de RuleSet para recompilar o exemplo de uso, porque a ferramenta carrega o assembly de exemplo de uso.