Applicazioni a 3 livelli con ASP.NET

di: Giuseppe Marchi     28 Novembre 2007

Presentazione

Lo sviluppo del livello di presentazione, quindi delle pagine e dei controlli Web della nostra applicazione, è l'ultimo passo da compiere nella costruzione di un sito a tre livelli e, nella maggior parte dei casi, è anche la parte più veloce da fare in quanto il "grosso" si può dire che è già stato fatto nei due livelli inferiori.

Per procedere all'inserimento di un nuovo post all'interno del nostro blog basta scrivere:

protected void OnInsert(object sender, EventArgs e)
{
  Post post = new Post();
  post.Author = "Marchi Giuseppe";
  post.Body = txtBody.Text.Replace("\r\n", "\r\n<br />");
  post.Category = Categories.GetCategoryByID(Int32.Parse(ddlCategories.SelectedValue));
  post.Date = DateTime.Now;
  post.Title = txtTitle.Text;

  new PostManager().InsertPost(post);
}

Mentre per quanto riguarda la visualizzazione dei messaggi, non dobbiamo far altro che utilizzare un oggetto di tipo DataSource per la lettura dei dati dalle nostre classi di business e un oggetto di tipo Data-Bound per la rappresentazione grafica di tali informazioni.

<asp:Repeater ID="rep" runat="server" DataSourceID="posts">
<ItemTemplate>
  <h2><%# Eval("Title") %></h2>
  <p><%# Eval("Body") %></p>
</ItemTemplate>
</asp:Repeater>

<asp:ObjectDataSource ID="posts" runat="server"
      SelectMethod="GetLast5" TypeName="Peppe.BLL.Posts" />

In questo caso risulta importante notare che il controllo di tipo ObjectDataSource preleva le informazioni richiamando la classe Posts del livello di Business Logic e non una classe del livello di accesso ai dati, in questo modo alla prima richiesta della pagina viene fatta una selezione dal database, ma già dalla seconda verranno lette le informazioni dalla cache del server, in conformità con quanto deciso nella nostra logica di business.

Allo stesso modo, il controllo di tipo Repeater è in grado di effettuare il binding dichiarativo direttamente sulle proprietà della classe Post, singolo oggetto della collezione che ritorna il metodo GetLast5(). Saranno poi i livelli sopra descritti a fare tutto il resto del lavoro.

Altra tecnica interessante può essere quella di legare il livello di business logic ad un server control personalizzato, senza utilizzare sempre oggetti di tipo DataSource. Nell'esempio scaricabile si è deciso di creare un oggetto che derivi dall'oggetto Calendar di ASP.NET 2.0 per visualizzare in quali giorni sono stati inseriti dei messaggi all'interno del blog.

Non si è dovuto far altro che creare una proprietà "DataSource" da supporto per il binding dei dati:

public object DataSource
{
  get { return dataSource; }
  set { dataSource = value; }
}

richiamare le informazioni all'interno del metodo OnInit del nostro controllo:

protected override void OnInit(EventArgs e)
{
  dataSource = Posts.GetAll().ToDataTable();
  base.OnInit(e);
}

effettuare l'overload del metodo

OnDayRender

per modificare la visualizzazione del calendario in base alle informazioni lette dalla fonte di dati:

protected override void OnDayRender(TableCell cell, CalendarDay day)
{
  DataTable posts = (DataTable)dataSource;
  DataView view = new DataView(posts);
  DateTime time = day.Date.AddDays(1);
  view.RowFilter = String.Format("{0} >= #{1}# and {0} < #{2}#",
        "Date", day.Date.ToString("MM/dd/yyyy"),
        time.ToString("MM/dd/yyyy"));
  
  if (view.Count > 0)
  {
    if (SelectedDate != day.Date)
    {
      cell.BorderStyle = BorderStyle.Solid;
      cell.BorderWidth = new Unit("1px");
      cell.BorderColor = ColorTranslator.FromHtml("#C0C0C0");
    }
  }
  else
  {
    day.IsSelectable = false;
  }

  base.OnDayRender(cell, day);
}

Il risultato a livello di presentazione del controllo è veramente d'effetto, soprattutto se si considera che è stato ottenuto con uno sforzo minimo.

Conclusioni

Dividere l'applicazione in più livelli logici aumenta il lavoro, ma i vantaggi in termini di manutenzione dell'applicazione e di prestazioni, sono notevoli. Basti pensare che se abbiamo bisogno di cambiare sistema di database, è sufficiente modificare uno solo dei livelli dell'applicazione.

Giuseppe Marchi è consulente informatico in ambito Microsoft .NET e dottore in Comunicazione Digitale; co-autore del libro "Pocket C#", editore Apogeo, collabora con community on-line di sviluppatori fornendo articoli e materiale. Dal 2006 è certificato Microsoft su ASP.NET 2.0 e Microsoft Certified Technology Specialist su Windows Sharepoint Services 3.0. Il suo sito Web personale www.peppedotnet.it contiene ulteriori informazioni ed esempi di codice.

Guide ASP.Net

Guida Windows Azure Code Snippets

Le migliori pratiche per far girare le applicazioni "in the cloud",...

Guida ASP.NET MVC Best Practices

Un workflow dettagliato e ricco di suggerimenti pratici per...

Guida ASP.NET Starter Kit

Un modo semplice per imparare ad utilizzare le tecnologie Microsoft...

Altre guide

Newsletter @Microsoft Dev

Ogni giovedì, direttamente nella tua e-mail: articoli, guide, tutorial e script ASP, ASP.Net, SQL server e IIS.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso Progettazione database

11 Maggio 2012 a Milano
Disponibilità: 6 Posti

Amministratore di Reti Windows Server 2008

11 Giugno 2012 a Milano
Disponibilità: 5 Posti

Nessun corso previsto