[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 16.15

Comments on this entry:

Gravatar # re: [Brainstorming] Anonymous DTO
by Luca Del Tongo at 18/09/2009 16.27

Ciao Mario, proprio in questi gg ho utilizzato gli anonymous types in un contesto simile a quello che hai descritto. Cmq sia non li definirei come dto, in quanto IMVHO in un dto ci vedo un componente che sposta dati tra sistemi, mentre in questo caso crei proprio dei tipi anonimi.
  
Gravatar # re: [Brainstorming] Anonymous DTO
by Mario Duzioni at 21/09/2009 8.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!
  
Gravatar # re: [Brainstorming] Anonymous DTO
by Luca Del Tongo at 22/09/2009 16.02

Ciao Mario, grazie per la precisazione fatta da wikipedia che da me viene interpretata evidenziando una certa differenza tra sottosistemi e layer applicativi... ma alla fine ci siamo capiti :)
  
Comments have been closed on this topic.