Invest in people before investing in tools

Il blog di Matteo Baglini
posts - 118, comments - 95, trackbacks - 697

[Spring.NET #20] Spring.Core, Expression Language

Expression Language è un linguaggio di interrogazione e manipolazione di grafi di oggetti. Questa funzionalità è molto utile in tutti quei casi di verifica dello stato di un oggetto a runtime. Spring.NET utilizza questo linguaggio per l' IoC Container, Data Validation ed il Data Binding per ASP.NET. Questo linguaggio utilizza la libreria ANTLR per costruire il Lexer ed il Parser dell'espressione. Tutta la grammatica utilizzabile all'interno di una espresione è definita nel file Expression.g . Facciamo subito un esempio per capiere meglio di cosa parliamo, all' interno una Console Application aggiungiamo una classe Student:

   1: using System;
   2:  
   3: namespace SpringSeries.Core.ExpressionLanguage
   4: {
   5:     public class Student
   6:     {
   7:         private string _lastName;
   8:         private string _firstName;
   9:         private DateTime _dateOdBirth = DateTime.MinValue;
  10:  
  11:         public string LastName
  12:         {
  13:             get { return _lastName; }
  14:             set { _lastName = value; }
  15:         }
  16:  
  17:         public DateTime DateOdBirth
  18:         {
  19:             get { return _dateOdBirth; }
  20:             set { _dateOdBirth = value; }
  21:         }
  22:  
  23:         public string FirstName
  24:         {
  25:             get { return _firstName; }
  26:             set { _firstName = value; }
  27:         }
  28:  
  29:         public int Age
  30:         {
  31:             get 
  32:             {
  33:                 return (DateTime.Now.Year - _dateOdBirth.Year); 
  34:             }
  35:         }
  36:  
  37:         public Student(string firstName, string lastName, DateTime dateOdBirth)
  38:         {
  39:             _firstName = firstName;
  40:             _lastName = lastName;
  41:             _dateOdBirth = dateOdBirth;
  42:         }
  43:  
  44:         public override string ToString()
  45:         {
  46:             return String.Format("Nome: {0} Cognome: {1} Età: {2}");
  47:         }
  48:     }
  49: }

ed una classe Classroom:

   1: using System;
   2: using System.Collections;
   3:  
   4: namespace SpringSeries.Core.ExpressionLanguage
   5: {
   6:     public class Classroom
   7:     {
   8:         IList _students = new ArrayList();
   9:  
  10:         public IList Students
  11:         {
  12:             get { return _students; }
  13:         }
  14:     }
  15: }

adesso data una Classroom con n Student dobbiamo stampare a video il nome degli Student con una età maggiore di 25 anni:

   1: using System;
   2: using System.Collections;
   3: using Spring.Expressions;
   4:  
   5: namespace SpringSeries.Core.ExpressionLanguage
   6: {
   7:     class Program
   8:     {
   9:         static void Main(string[] args)
  10:         {
  11:             Classroom _class = new Classroom();
  12:             _class.Students.Add(new Student("Matteo", "Baglini", new DateTime(1982, 08, 11)));
  13:             _class.Students.Add(new Student("Mario", "Rossi", new DateTime(1967, 08, 11)));
  14:             _class.Students.Add(new Student("Luca", "Bianchi", new DateTime(1977, 02, 16)));
  15:  
  16:             string _exp = "Students.?{Age>25}.!{FirstName}";
  17:  
  18:             IList _selectedPupils = (IList)ExpressionEvaluator.GetValue(_class, _exp);
  19:  
  20:             foreach (string _item in _selectedPupils)
  21:             {
  22:                 Console.WriteLine("Nome {0} età", _item);
  23:             }
  24:  
  25:             Console.Read();
  26:         }
  27:     }
  28: }

come potete vedere basta definire una stringa e valorizzarla con l'espressione di interrogazione ed in fine richiamare il metodo statico ExpressionEvaluator.GetValue passando come parametro l'oggetto da interrogare e l'espressione da applicare. Il linguaggio è molto potente e permette l' esecuizione di moltissime operazioni. Di seguito vi l'elenco di tutte le funzionalità fornite dall' Expression Language:

Technorati Tags:

Print | posted on sabato 24 novembre 2007 19:56 | Filed Under [ .NET OpenSource Spring.NET ]

Powered by:
Powered By Subtext Powered By ASP.NET