[Brainstorming] Anonymous DTO

Quando “indovinate chi” mi introdusse, ormai anni fa, al concetto di base degli Anonymous Types mi comparve subito un sorriso da buongustaio sulla faccia. Di contro l’aver scoperto poco più tardi che tali oggetti sono (giustamente) utilizzabili solo come variabili locali smorzarono di parecchio l’entusiasmo. Non che questo riduca il loro grande valore, ma so di non essere l’unico che, pur apprezzando i vantaggi dei DTO, non sia proprio veramente così felice ogni volta che si rende conto di doverne inserire uno “ad hoc” nella solution.

Oggi però mi sono reso conto di un aspetto che forse ho sempre trascurato: alcuni controlli UI utilizzano già Reflection per generare il proprio contenuto e quindi, in quel caso, il naso non mi si “storce” più di tanto utilizzando una collection non tipizzata per “trasportare” i DTO “anonimi” al solo fine di darlo in pasto al controllo.

   1: namespace Library1
   2: {
   3:     public class AnonymousDtoFactory
   4:     {
   5:         public static IList GetSampleDataSource()
   6:         {
   7:             Collection<object> dataSource = new Collection<object>();
   8:             foreach (var fullFileName in System.IO.Directory.GetFiles(@"C:\"))
   9:             {
  10:                 AddDtoToDataSource(dataSource, new System.IO.FileInfo(fullFileName));
  11:             }
  12:             return dataSource;
  13:         }
  14:  
  15:         private static void AddDtoToDataSource(Collection<object> dataSource, System.IO.FileInfo file)
  16:         {
  17:             dataSource.Add(new { FullName = file.FullName, Size = file.Length, LastWrite = file.LastWriteTime.ToShortDateString() });
  18:         }
  19:     }
  20: }

 

Ovviamente in caso di necessità, nulla vieta di utilizzare direttamente Reflection:

   1: private static void TestAnonymousDto()
   2: {
   3:     foreach (var item in Library1.AnonymousDtoFactory.GetSampleDataSource())
   4:     {
   5:         foreach (var prop in item.GetType().GetProperties())
   6:         {
   7:             Console.Write("Property name: ");
   8:             Console.Write(prop.Name);
   9:             Console.Write(" - Value: ");
  10:             Console.WriteLine(prop.GetValue(item, null));
  11:         }
  12:         Console.WriteLine("------------------");
  13:     }
  14: }

 

Niente di particolare, ma potrebbe essere d’aiuto in quei piccoli casi marginali, evitando di dover introdurre n piccole classi nella solution.

Print | posted @ venerdì 18 settembre 2009 19:15

Comments on this entry:

Gravatar # re: [Brainstorming] Anonymous DTO
by Mario Duzioni at 21/09/2009 11:37

Su Wikipedia lo descrivono così:
"DTO [...] is a design pattern used to transfer data between software application *subsystems*. DTOs are often used in conjunction with data access objects to retrieve data from a database."

Evidenzio in particolare "application subsystems", cmq il primo esempio che mi viene in mente sono i DTO, talvolta necessari, tra Presenter e View.

Ciao!
Comments have been closed on this topic.