Os controles de fonte de dados são um novo tipo de controle de servidor introduzido no Microsoft Visual Studio 2005. Eles são uma parte fundamental da arquitetura de vinculação de dados e podem fornecer um modelo de programação declarativo e um comportamento automático de vinculação de dados por meio de controles de vinculação de dados. Este artigo e os artigos subsequentes desta série apresentarão os principais elementos da implementação de controles de fonte de dados.
Introdução
Resumindo, um controle de fonte de dados resume um armazenamento de dados e algumas operações que podem ser executadas nos dados contidos. O controle DataBound está associado a um controle de fonte de dados por meio de sua propriedade DataSourceID. A maioria dos armazenamentos de dados tradicionais são tabulares ou hierárquicos, e os controles da fonte de dados são divididos de acordo. O que queremos apresentar aqui é o controle da fonte de dados em formato tabular.
O controle da fonte de dados em si não faz muita coisa; toda a lógica é encapsulada em classes derivadas de DataSourceView. Pelo menos um DataSourceView deve implementar a função de recuperar (ou seja, selecionar) um conjunto de linhas. Pode fornecer a função de modificar dados (ou seja, INSERT, UPDATE e DELETE) (opcional). Os controles vinculados a dados podem verificar conjuntos de recursos habilitados por meio de várias propriedades Can???. O próprio controle da fonte de dados é apenas um contêiner para uma ou mais visualizações com nomes exclusivos. Por convenção, a visualização padrão pode ser acessada pelo seu nome ou pode estar vazia. Se ou que tipo de relacionamento existe entre diferentes visualizações pode ser definido adequadamente com base na implementação de cada controle de fonte de dados. Por exemplo, um controle de fonte de dados pode fornecer diferentes exibições filtradas dos mesmos dados por meio de exibições diferentes ou pode fornecer um conjunto de sub-linhas em uma exibição secundária. Você pode usar a propriedade DataMember de um controle vinculado a dados para selecionar um modo de exibição específico (se o controle de fonte de dados fornecer vários modos de exibição). Observe que nenhum dos controles de fonte de dados integrados no Whidbey oferece atualmente múltiplas visualizações.
Finalmente, deixe-me apresentar algum conteúdo. Os controles de fonte de dados (e suas visualizações) implementam dois conjuntos de APIs. O primeiro conjunto de APIs é uma interface abstrata definida para quatro operações de dados comuns que podem ser usadas regularmente a partir de qualquer controle vinculado a dados. O segundo grupo é opcional, definido em termos do domínio ou armazenamento de dados que representa, geralmente é fortemente tipado e destina-se a desenvolvedores de aplicativos.
Exemplo
Nestes artigos, você implementará um WeatherDataSource que funcionará na API XML REST (inglês) fornecida por weather.com (inglês) para recuperar informações meteorológicas com base no código postal. Os controles de fonte de dados derivados geralmente são implementados primeiro.
classe pública WeatherDataSource: DataSourceControl {
string somente leitura estática pública
CurrentConditionsViewName = "Condições Atuais";
private WeatherDataSourceView _currentConditionsView
private WeatherDataSourceView CurrentConditionsView {
;
pegar {
if (_currentConditionsView == nulo) {
_currentConditionsView = new WeatherDataSourceView(this, CurrentConditionsViewName);
}
retornar _currentConditionsView;
}
}
string pública CEP {
pegar {
string s = (string)ViewState["Código Postal"];
retornar (s! = nulo) s: String.Empty;
}
definir {
if (String.Compare(valor, CEP,
StringComparison.Ordinal) != 0) {
ViewState["Código Postal"] = valor;
CurrentConditionsView.RaiseChangedEvent();
}
}
}
substituição protegida DataSourceView GetView(string viewName) {
if (String.IsNullOrEmpty(viewName) ||
(String.Compare(viewName, CurrentConditionsViewName,
StringComparison.OrdinalIgnoreCase) == 0)) {
retornar CurrentConditionsView;
}
lançar novo ArgumentOutOfRangeException("viewName");
}
substituição protegida ICollection GetViewNames() {
retornar nova string[] { CurrentConditionsViewName };
}
clima público GetWeather() {
retornar CurrentConditionView.GetWeather();
}
}
Como você pode ver, a ideia básica é implementar GetView para retornar uma instância de visualização nomeada e GetViewNames para retornar o conjunto de visualizações disponíveis.
Escolha aqui Derivar de DataSourceControl. Uma coisa que não é fácil de notar é que o controle vinculado a dados realmente procura a interface IDataSource, e o controle DataSource implementa a interface implementando GetView e GetViewNames. A razão pela qual a interface é necessária é permitir que o controle da fonte de dados seja tabular e hierárquico (se possível, nesse caso derivar do modelo principal e implementar outro modelo como interface). Em segundo lugar, também permite que outros controlos sejam convertidos em vários cenários para duplicar a capacidade da fonte de dados. Observe também a propriedade pública ZipCode e o método GetWeather que retorna um objeto Weather fortemente tipado. Esta API é adequada para desenvolvedores de páginas. Os desenvolvedores de páginas não precisam pensar em DataSourceControl e DataSourceView.
A próxima etapa é implementar a própria visualização da fonte de dados. Este exemplo específico fornece apenas funcionalidade no nível SELECT (que é o requisito mínimo e a única funcionalidade útil neste cenário).
classe selada privada WeatherDataSourceView: DataSourceView {
private WeatherDataSource _owner;
public WeatherDataSourceView (proprietário do WeatherDataSource, string viewName)
: base(proprietário, viewName) {
_proprietário = proprietário;
}
substituição protegida IEnumerable ExecuteSelect(
Argumentos DataSourceSelectArguments) {
argumentos.RaiseUnsupportedCapabilitiesError(this)
;
retornar novo clima[] {weatherObject};
}
clima interno GetWeather() {
string zipCode = _owner.ZipCode;
if (zipCode.Comprimento == 0) {
lançar new InvalidOperationException();
}
WeatherService weatherService = new WeatherService(zipCode);
retornar weatherService.GetWeather();
}
interno void RaiseChangedEvent() {
OnDataSourceViewChanged(EventArgs.Empty);
}
}
Por padrão, a classe DataSourceView retorna false de propriedades como CanUpdate e lança NotSupportedException de Update e métodos relacionados. A única coisa que você precisa fazer aqui no WeatherDataSourceView é substituir o método abstrato ExecuteSelect e retornar um IEnumerable contendo os dados meteorológicos "selecionados". Na implementação, é usada uma classe auxiliar WeatherService, que simplesmente usa um objeto WebRequest para consultar weather.com (em inglês) usando o CEP selecionado (nada de especial nisso).
Você deve ter notado que ExecuteSelect está marcado como protegido. O que o controle vinculado a dados realmente chama é o método Select público (e selado) passado no retorno de chamada. A implementação de Select chama ExecuteSelect e chama o retorno de chamada com a instância IEnumerable resultante. Esse padrão é muito estranho. Há uma razão para isso, que será explicada nos artigos subsequentes desta série. Aguarde...
Aqui está um exemplo deste uso:
CEP: <asp:TextBox runat="server" id="zipCodeTextBox" />
<asp:Button runat="servidor" onclick="OnLookupButtonClick" Text="Look" />
<hr />
<asp:FormView runat="servidor" DataSourceID="weatherDS">
<ItemTemplate>
<asp:Label runat="servidor"
Text='<%# Eval("Temperatura", "A temperatura atual é {0}.") %>' />
</ItemTemplate>
</asp:FormView>
<nk:WeatherDataSource runat="servidor" id="weatherDS" ZipCode="98052" />
<script runat="servidor">
private void OnLookupButtonClick(objeto remetente, EventArgs e) {
weatherDS.ZipCode = zipCodeTextBox.Text.Trim();
}
</script>
Esse código define o CEP em resposta à entrada do usuário, o que faz com que a fonte de dados emita uma notificação de alteração, fazendo com que o controle FormView vinculado execute a vinculação de dados e altere a exibição.
Agora, o código de acesso aos dados está encapsulado no controle da fonte de dados. Além disso, este modelo permite que o weather.com (em inglês) publique um componente que também pode encapsular detalhes específicos do seu serviço. Espero que funcione. Além disso, a interface abstrata da fonte de dados permite que o FormView funcione apenas com dados meteorológicos.
No próximo artigo, você aprimorará o controle da fonte de dados para lidar automaticamente com alterações no valor do filtro (ou seja, CEP) usado para consultar os dados.