Kit de ferramentas de conjunto de regras externo
Normalmente, quando as regras são usadas em um aplicativo de fluxo de trabalho, as regras fazem parte do assembly. Em alguns cenários, convém manter os RuleSets separadamente do assembly para que eles possam ser atualizados sem reconstruir e implantar o assembly do fluxo de trabalho. Este exemplo permite gerenciar e editar RuleSets em um banco de dados e acessar esses RuleSets de um fluxo de trabalho em tempo de execução. Isso permite que as instâncias de fluxo de trabalho em execução incorporem automaticamente as alterações do RuleSet.
O exemplo de Kit de Ferramentas de Conjunto de Regras Externo contém uma ferramenta baseada em Windows Forms que você pode usar para gerenciar e editar versões de RuleSet em um banco de dados. Também inclui uma atividade e um serviço de host para executar essas regras.
Nota
Este exemplo requer o Microsoft SQL Server.
O Visual Studio fornece um editor RuleSet como parte do Windows Workflow Foundation (WF). 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 RuleSet que é configurado no aplicativo host e acessa RuleSets do banco de dados.
Uma
ExternalPolicy
atividade que solicita um RuleSet do serviço RuleSet e executa o RuleSet no fluxo de trabalho.
A interação dos componentes é mostrada na imagem a seguir. As seções a seguir descrevem cada componente.
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 ao armazenamento. 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.
A ferramenta RuleSet aplica números de versão principais e secundários aos RuleSets, permitindo que você mantenha e armazene simultaneamente várias versões (a ferramenta não fornece bloqueio ou outros recursos de gerenciamento de configuração, além do recurso 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 selecionada do RuleSet, incluindo as regras contidas, e atribui números de versão novos e exclusivos. Esses números de versão são baseados nos números de versão dos Conjuntos de Regras existentes. Você pode alterar o nome e os números de versão do RuleSet usando os campos associados no formulário.
Quando você clica em Editar regras, o editor RuleSet é iniciado, conforme mostrado na imagem a seguir:
Esta é uma nova hospedagem da caixa de diálogo do editor que faz parte do suplemento Visual Studio do Windows Workflow Foundation. Ele fornece a mesma funcionalidade, incluindo suporte 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 em Procurar na caixa de diálogo da ferramenta principal, a caixa de diálogo Workflow/Type Seletor é exibida, como mostra a Figura 4.
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 contra o 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 em qualquer tipo .NET.
O caminho para o arquivo 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 Conjunto de Regras, 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 revalidar a versão do Conjunto de Regras em relação à atividade de destino.
No menu Dados da ferramenta, você pode importar e exportar RuleSets. Quando você clica em Importar, uma caixa de diálogo do seletor de arquivos é exibida, a partir da 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 contém 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 RuleSet Seletor é exibida. Você pode usar a caixa de diálogo para selecionar os RuleSets do arquivo que deseja importar (o padrão especifica todos os RuleSets). RuleSets no arquivo .rules não têm números de versão, porque seu controle de versão em um projeto 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 pode ser alterado após a importação); você pode ver os números de versão atribuídos na lista Seletor de Conjunto de Regras.
Para cada RuleSet importado, a ferramenta tenta localizar o tipo associado da pasta bin\Debug no local do arquivo .rules (se existir), com base nos membros usados no RuleSet. Se a ferramenta encontrar vários tipos correspondentes, 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, você será solicitado a selecionar o tipo. Se esse mecanismo de identificação automática não conseguir 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:
Quando você clica em Exportar dados no menu principal da ferramenta, a caixa de diálogo Seletor de conjunto de regras aparece novamente, a partir 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 do RuleSet com um determinado nome do RuleSet.
Atividade PolicyFromService
O código da PolicyFromService
atividade é simples. Ele funciona de forma muito semelhante à atividade fornecida com o Policy
WF, mas em vez de recuperar o RuleSet de destino do arquivo .rules, ele chama um serviço de host para obter a instância 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 PolicyActivities
assemblies e RuleSetService
do seu projeto de fluxo de trabalho. Consulte o procedimento no final deste tópico para 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 vincular 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 da versão mais recente no banco de dados será fornecido automaticamente para a atividade.
Serviço RuleSet
O serviço é responsável por recuperar a versão especificada do RuleSet do banco de dados e retorná-la à atividade de chamada. Como discutido anteriormente, se os valores da versão principal e secundária passados GetRuleSet
na 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 as versões do RuleSet como "implantadas" para diferenciá-las dos RuleSet em andamento.
O banco de dados a ser acessado pelo serviço deve ser configurado no host usando um arquivo de configuração do aplicativo.
Para executar a ferramenta
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 lotes Setup.cmd para criar o banco de dados Rules no SQL Express e configurar a tabela RuleSet.
Se você editar o arquivo em lotes ou Setup.sql e especificar não usar o SQL Express ou colocar a tabela em um banco de dados chamado algo diferente de
Rules
, os arquivos de configuração do aplicativo na ferramenta RuleSet eUsageSample
os projetos deverão ser editados com as mesmas informações.Depois de executar o script Setup.sql, você pode criar a
ExternalRuleSetToolkit
solução e, em seguida, iniciar a ferramenta RuleSet do projeto ExternalRuleSetTool.A
RuleSetToolkitUsageSample
solução Sequential Workflow Console Application inclui um fluxo de trabalho de exemplo. O fluxo de trabalho consiste em umaPolicyFromService
atividade e duas variáveis,orderValue
ediscount
, em relação às quais o RuleSet de destino é executado.Para usar o exemplo, crie a
RuleSetToolkitUsageSample
solução. Em seguida, no menu principal da ferramenta RuleSet, clique em Data-Import e aponte para o arquivo DiscountRuleSet.rules na pasta RuleSetToolkitUsageSample. Clique na opção de menu Repositório de Regras-Salvar para salvar o RuleSet importado no banco de dados.Como o
PolicyActivities
assembly é referenciado a partir do projeto de fluxo de trabalho de exemplo, aPolicyFromService
atividade aparece no fluxo de trabalho. No entanto, 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
PolicyActivities
assembly na solução e clique emExternalRuleSetToolkit
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 RuleSetToolkitUsageSample Components .
O serviço RuleSet já está configurado no host do aplicativo de console usando a instrução a seguir no Program.cs.
workflowRuntime.AddService(new RuleSetService());
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.
Um arquivo de configuração do 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.
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.Nota
Você deve fechar a ferramenta RuleSet para recompilar o exemplo de uso, porque a ferramenta carrega o assembly de exemplo de uso.