Desenvolvendo uma interface do usuário para um componente de fluxo de dados
Aplica-se a: SQL Server SSIS Integration Runtime no Azure Data Factory
Os desenvolvedores de componentes podem fornecer uma interface de usuário personalizada para um componente, que é exibida no SQL Server Data Tools (SSDT) quando o componente é editado. A implementação de uma interface de usuário personalizada fornece a você uma notificação quando o componente é adicionado a ou excluído de uma tarefa de fluxo de dados, e quando é solicitada ajuda para o componente.
Se você não fornecer uma interface de usuário personalizada para seu componente, os usuários ainda poderão configurar o componente e suas propriedades personalizadas utilizando o Editor Avançado. Para certificar-se de que o Editor Avançado permita aos usuários editar valores de propriedade personalizados adequadamente, utilize as propriedades TypeConverter e UITypeEditor do IDTSCustomProperty100 quando apropriado. Para obter mais informações, consulte "Criando propriedades personalizadas" em Métodos de tempo de design de um componente de fluxo de dados.
Definindo a propriedade UITypeName
Para fornecer uma interface de usuário personalizada, o desenvolvedor deve definir a propriedade UITypeName do DtsPipelineComponentAttribute como o nome de uma classe que implementa a interface IDtsComponentUI. Quando essa propriedade é definida pelo componente, o SQL Server Integration Services carrega e chama a interface do usuário personalizada quando o componente é editado no Designer do SSIS.
A propriedade UITypeName é uma cadeia de caracteres delimitada por vírgulas que identifica o nome totalmente qualificado do tipo. A lista a seguir mostra, em ordem, os elementos que identificam o tipo:
Nome do tipo
Nome do assembly
Versão do arquivo
Cultura
Token de chave pública
O exemplo de código a seguir mostra uma classe que deriva da classe base PipelineComponent e especifica a propriedade UITypeName.
[DtsPipelineComponent(
DisplayName="SampleComponent",
UITypeName="MyNamespace.MyComponentUIClassName,MyAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abcd...",
ComponentType = ComponentType.Transform)]
public class SampleComponent : PipelineComponent
{
//TODO: Implement the component here.
}
<DtsPipelineComponent(DisplayName="SampleComponent", _
UITypeName="MyNamespace.MyComponentUIClassName,MyAssemblyName,Version=1.0.0.0,Culture=neutral,PublicKeyToken=abcd...", ComponentType=ComponentType.Transform)> _
Public Class SampleComponent
Inherits PipelineComponent
End Class
Implementando a interface IDtsComponentUI
A interface IDtsComponentUI contém métodos que o Designer SSIS chama quando um componente é adicionado, excluído e editado. Desenvolvedores de componente podem fornecer código na sua implementação desses métodos para interagir com usuários do componente.
Essa classe costuma ser implementada em um assembly separado do próprio componente. Embora o uso de um assembly separado não seja exigido, isso permite ao desenvolvedor criar e empregar o componente e a interface de usuário separadamente, e mantém a superfície binária do componente pequena.
A implementação de uma interface de usuário personalizada dá ao desenvolvedor de componente mais controle sobre o componente pois ele é editado no Designer SSIS. Por exemplo, um componente pode adicionar código ao método New, que é chamado quando um componente é inicialmente adicionado a uma tarefa de fluxo de dados, e exibir um assistente que orienta o usuário na configuração inicial do componente.
Após criar uma classe que implementa a interface IDtsComponentUI, adicione código para responder à interação do usuário com o componente. O método Initialize fornece a interface IDTSComponentMetaData100 do componente e é chamado antes dos métodos New e Edit. Essa referência deve ser armazenada em uma variável de membro particular e usada para modificar metadados do componente depois disso.
Modificando um componente e mantendo alterações
A interface IDTSComponentMetaData100 é fornecida como um parâmetro ao método Initialize. Essa referência deve ser armazenada em cache em uma variável de membro pelo código de interface de usuário e, depois, usada para modificar o componente em resposta à interação do usuário com a interface de usuário.
Embora você possa modificar o componente diretamente através da interface IDTSComponentMetaData100, é melhor criar uma instância do CManagedComponentWrapper utilizando o método Instantiate. Quando você edita o componente diretamente através da interface, ignora as garantias de validação dele. A vantagem de utilizar a instância de tempo de design do componente através do CManagedComponentWrapper é que você garante o controle pelo componente das alterações feitas nele.
O valor de retorno do método Edit determina se alterações feitas em um componente são mantidas ou descartadas. Quando esse método retorna false, todas as alterações são descartadas; true mantém as alterações no componente e marca o pacote que deve ser salvo.
Usando os serviços do Designer SSIS
O parâmetro IServiceProvider do método Initialize fornece acesso aos seguintes serviços do Designer SSIS:
Serviço | Descrição |
---|---|
IDtsClipboardService | Usado para determinar se o componente foi gerado como parte de uma operação copiar/colar ou recortar/colar. |
IDtsConnectionService | Usado acessar conexões existentes ou criar novas conexões no pacote. |
IErrorCollectionService | Usado para capturar eventos de componentes de fluxo de dados quando você precisa capturar todos os erros e avisos levantados pelo componente, em vez de receber apenas o último erro ou aviso. |
IDtsVariableService | Usado para acessar variáveis existentes ou criar novas variáveis no pacote. |
IDtsPipelineEnvironmentService | Usado por componentes de fluxo de dados para acessar a tarefa Fluxo de Dados pai e outros componentes no fluxo de dados. Esse recurso pode ser usado para desenvolver um componente como o Assistente para Dimensões de Alteração Lenta, que cria e conecta componentes de fluxo de dados adicionais, conforme necessário. |
Esses serviços oferecem aos desenvolvedores de componente a capacidade de acessar e criar objetos no pacote no qual o componente é carregado.
Amostra
O exemplo de código a seguir mostra a integração de uma classe de interface do usuário personalizada que implementa a interface IDtsComponentUI, e um formulário do Windows que serve como o editor de um componente.
Classe de interface do usuário personalizada
O código a seguir mostra a classe que implementa a interface IDtsComponentUI. O método Edit cria o editor de componente e, depois, exibe o formulário. O valor de retorno do formulário determina se as alterações do componente são mantidas.
using System;
using System.Windows.Forms;
using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline.Design;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
namespace Microsoft.Samples.SqlServer.Dts
{
public class SampleComponentUI : IDtsComponentUI
{
IDTSComponentMetaData100 md;
IServiceProvider sp;
public void Help(System.Windows.Forms.IWin32Window parentWindow)
{
}
public void New(System.Windows.Forms.IWin32Window parentWindow)
{
}
public void Delete(System.Windows.Forms.IWin32Window parentWindow)
{
}
public bool Edit(System.Windows.Forms.IWin32Window parentWindow, Variables vars, Connections cons)
{
// Create and display the form for the user interface.
SampleComponentUIForm componentEditor = new SampleComponentUIForm(cons, vars, md);
DialogResult result = componentEditor.ShowDialog(parentWindow);
if (result == DialogResult.OK)
return true;
return false;
}
public void Initialize(IDTSComponentMetaData100 dtsComponentMetadata, IServiceProvider serviceProvider)
{
// Store the component metadata.
this.md = dtsComponentMetadata;
}
}
}
Imports System
Imports System.Windows.Forms
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Pipeline.Design
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Namespace Microsoft.Samples.SqlServer.Dts
Public Class SampleComponentUI
Implements IDtsComponentUI
Private md As IDTSComponentMetaData100
Private sp As IServiceProvider
Public Sub Help(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Sub New(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Sub Delete(ByVal parentWindow As System.Windows.Forms.IWin32Window)
End Sub
Public Function Edit(ByVal parentWindow As System.Windows.Forms.IWin32Window, ByVal vars As Variables, ByVal cons As Connections) As Boolean
' Create and display the form for the user interface.
Dim componentEditor As SampleComponentUIForm = New SampleComponentUIForm(cons, vars, md)
Dim result As DialogResult = componentEditor.ShowDialog(parentWindow)
If result = DialogResult.OK Then
Return True
End If
Return False
End Function
Public Sub Initialize(ByVal dtsComponentMetadata As IDTSComponentMetaData100, ByVal serviceProvider As IServiceProvider)
Me.md = dtsComponentMetadata
End Sub
End Class
End Namespace
Editor personalizado
O código a seguir mostra a implementação do formulário do Windows que é mostrado durante a chamada ao método Edit.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime;
namespace Microsoft.Samples.SqlServer.Dts
{
public partial class SampleComponentUIForm : System.Windows.Forms.Form
{
private Connections connections;
private Variables variables;
private IDTSComponentMetaData100 metaData;
private CManagedComponentWrapper designTimeInstance;
private System.ComponentModel.IContainer components = null;
public SampleComponentUIForm( Connections cons, Variables vars, IDTSComponentMetaData100 md)
{
variables = vars;
connections = cons;
metaData = md;
}
private void btnOk_Click(object sender, System.EventArgs e)
{
if (designTimeInstance == null)
designTimeInstance = metaData.Instantiate();
designTimeInstance.SetComponentProperty( "CustomProperty", txtCustomPropertyValue.Text);
this.Close();
}
private void btnCancel_Click(object sender, System.EventArgs e)
{
this.Close();
}
}
}
Imports System
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime
Namespace Microsoft.Samples.SqlServer.Dts
Public Partial Class SampleComponentUIForm
Inherits System.Windows.Forms.Form
Private connections As Connections
Private variables As Variables
Private metaData As IDTSComponentMetaData100
Private designTimeInstance As CManagedComponentWrapper
Private components As System.ComponentModel.IContainer = Nothing
Public Sub New(ByVal cons As Connections, ByVal vars As Variables, ByVal md As IDTSComponentMetaData100)
variables = vars
connections = cons
metaData = md
End Sub
Private Sub btnOk_Click(ByVal sender As Object, ByVal e As System.EventArgs)
If designTimeInstance Is Nothing Then
designTimeInstance = metaData.Instantiate
End If
designTimeInstance.SetComponentProperty("CustomProperty", txtCustomPropertyValue.Text)
Me.Close
End Sub
Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Me.Close
End Sub
End Class
End Namespace