codeplanner

LiveDB generic

Dec 23rd, 2012
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.21 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using LiveDomain.Core;
  5.  
  6.  
  7. namespace LiveDbFirstTest
  8. {
  9.     //My DomainModel
  10.     [Serializable]
  11.     public abstract class PersistentEntity
  12.     {
  13.         public Guid Id { get; set; }
  14.     }
  15.     [Serializable]
  16.     public abstract class LocationEntity : PersistentEntity
  17.     {
  18.         public string Lat { get; set; }
  19.         public string Lng { get; set; }
  20.     }
  21.     [Serializable]
  22.     public class Tag : PersistentEntity
  23.     {
  24.         public string Name { get; set; }
  25.     }
  26.     [Serializable]
  27.     public class Spot : LocationEntity
  28.     {
  29.         public string Name { get; set; }
  30.         public IList<Tag> Tags { get; set; }
  31.  
  32.         public Spot()
  33.         {
  34.             this.Tags = new List<Tag>();
  35.         }
  36.     }
  37.  
  38.     //Model
  39.     [Serializable]
  40.     public class GenericModel : Model
  41.     {
  42.         public IDictionary<Guid, object> Entities { get; set; }
  43.  
  44.         public GenericModel()
  45.         {
  46.             this.Entities = new Dictionary<Guid, object>();
  47.         }
  48.  
  49.         public T SaveOrUpdate<T>(T entity) where T : PersistentEntity
  50.         {
  51.             if(this.Entities.ContainsKey(entity.Id))
  52.             {
  53.                 this.Entities[entity.Id] = entity;
  54.             }
  55.             else
  56.             {
  57.                 this.Entities.Add(entity.Id, entity);
  58.             }
  59.            
  60.             return entity;
  61.         }
  62.  
  63.         public IEnumerable<T> GetAll<T>() where T : PersistentEntity
  64.         {
  65.             return this.Entities.Values.OfType<T>().ToList();          
  66.         }
  67.  
  68.         public IEnumerable<T> Find<T>(Func<T, bool> expression) where T : PersistentEntity
  69.         {
  70.             return this.Entities.Values.OfType<T>().Where(expression).ToList();            
  71.         }
  72.  
  73.         public T GetById<T>(Guid id) where T : PersistentEntity
  74.         {
  75.             return this.Entities.Values.OfType<T>().Single(p => p.Id == id);
  76.         }
  77.  
  78.         public void Delete<T>(Guid id) where T : PersistentEntity
  79.         {
  80.             this.Entities.Remove(id);
  81.         }
  82.  
  83.         public void Delete<T>(T entity) where T : PersistentEntity
  84.         {
  85.             this.Delete<T>(entity.Id);
  86.         }        
  87.     }
  88.  
  89.     //Helpers for Commands
  90.     public static class Commands
  91.     {
  92.         public static T SaveOrUpdate<T>(this Engine e, T entity)
  93.             where T : PersistentEntity      
  94.         {
  95.             var cmd = new GenericSaveCommand<T, GenericModel>(entity);
  96.             return e.Execute(cmd) as T;
  97.         }
  98.         public static void Delete<T>(this Engine e, T entity)
  99.             where T : PersistentEntity
  100.         {
  101.             var cmd = new GenericDeleteCommand<T, GenericModel>(entity);
  102.             e.Execute(cmd);
  103.         }
  104.         public static void Delete<T>(this Engine e, Guid id)
  105.             where T : PersistentEntity
  106.         {
  107.             var cmd = new GenericDeleteCommand<T, GenericModel>(id);
  108.             e.Execute(cmd);
  109.         }
  110.     }
  111.  
  112.     //Helpers for Queries
  113.     public static class Queries
  114.     {
  115.         public static IList<T> GetAll<T>(this Engine e)
  116.             where T : PersistentEntity
  117.         {
  118.             var query = new GenericGetAllQuery<T>();
  119.             return (IList<T>) e.Execute(query);
  120.         }
  121.         public static T GetById<T>(this Engine e, Guid id)
  122.             where T : PersistentEntity
  123.         {
  124.             var query = new GenericGetByIdQuery<T>(id);
  125.             return e.Execute(query) as T;
  126.         }
  127.  
  128.         public static IEnumerable<T> Find<T>(this Engine e, Func<T,bool> expression)
  129.             where T : PersistentEntity
  130.         {
  131.             var query = new GenericFindQuery<T>(expression);
  132.             return e.Execute(query) as IEnumerable<T>;
  133.         }
  134.     }
  135.    
  136.     //Command - SAVE
  137.     [Serializable]
  138.     public class GenericSaveCommand<T, TA> : Command<TA>
  139.         where T : PersistentEntity
  140.         where TA : GenericModel
  141.     {
  142.         private readonly T _entity;
  143.  
  144.         public GenericSaveCommand(T entity)
  145.         {
  146.             this._entity = entity;
  147.         }
  148.  
  149.         protected override void Execute(TA model)
  150.         {
  151.             model.SaveOrUpdate(this._entity);
  152.         }
  153.     }
  154.  
  155.     //Command - DELETE
  156.     [Serializable]
  157.     public class GenericDeleteCommand<T, TA> : Command<TA>
  158.         where T : PersistentEntity
  159.         where TA : GenericModel
  160.     {
  161.         private readonly Guid _id;
  162.  
  163.         public GenericDeleteCommand(T entity)
  164.         {
  165.             this._id = entity.Id;
  166.         }
  167.         public GenericDeleteCommand(Guid id)
  168.         {
  169.             this._id = id;
  170.         }
  171.  
  172.         protected override void Execute(TA model)
  173.         {
  174.             model.Delete<T>(this._id);
  175.         }
  176.     }
  177.  
  178.     //Query - ALL
  179.     [Serializable]
  180.     public class GenericGetAllQuery<T> : Query<GenericModel, IEnumerable<T>> where T : PersistentEntity
  181.     {
  182.         protected override IEnumerable<T> Execute(GenericModel model)
  183.         {
  184.             return model.GetAll<T>();
  185.         }
  186.     }
  187.     //Query - FIND
  188.     [Serializable]
  189.     public class GenericFindQuery<T> : Query<GenericModel, IEnumerable<T>> where T : PersistentEntity
  190.     {
  191.         private Func<T, bool> _expression;
  192.         public GenericFindQuery(Func<T,bool> expression)
  193.         {
  194.             this._expression = expression;
  195.         }
  196.  
  197.         protected override IEnumerable<T> Execute(GenericModel model)
  198.         {
  199.             return model.Find<T>(this._expression);
  200.         }
  201.     }
  202.     //Query - BY ID
  203.     [Serializable]
  204.     public class GenericGetByIdQuery<T> : Query<GenericModel, T> where T : PersistentEntity
  205.     {
  206.         private readonly Guid _id;
  207.         public GenericGetByIdQuery(Guid id)
  208.         {
  209.             this._id = id;
  210.         }
  211.  
  212.         protected override T Execute(GenericModel model)
  213.         {
  214.             return model.GetById<T>(this._id);
  215.         }
  216.     }
  217.  
  218.  
  219.  
  220.     class Program
  221.     {
  222.         static void Main(string[] args)
  223.         {
  224.             var engine = Engine.LoadOrCreate<GenericModel>();
  225.  
  226.             var spot = new Spot
  227.                            {
  228.                                Lat = "62.234",
  229.                                Lng = "17.342",
  230.                                Name = "Localhost",
  231.                                Id = Guid.NewGuid(),
  232.                                Tags = new List<Tag> {new Tag {Name = "C#"}, new Tag {Name = "JavaScript"}}
  233.                            };
  234.            
  235.             engine.SaveOrUpdate(spot);
  236.  
  237.             foreach (var s in engine.GetAll<Spot>())
  238.             {
  239.                 Console.WriteLine(s.Id);
  240.                 Console.WriteLine(s.Name);
  241.                 foreach (var tag in s.Tags)
  242.                 {
  243.                     Console.WriteLine(tag.Name);
  244.                 }
  245.                 Console.WriteLine();
  246.             }
  247.  
  248.             foreach (var s in engine.Find<Spot>(p => p.Name == "Localhost"))
  249.             {
  250.                 Console.WriteLine(s.Id);
  251.                 Console.WriteLine(s.Name);
  252.                 foreach (var tag in s.Tags)
  253.                 {
  254.                     Console.WriteLine(tag.Name);
  255.                 }
  256.                 Console.WriteLine();
  257.             }
  258.  
  259.             Console.ReadLine();
  260.         }
  261.     }
  262. }
Add Comment
Please, Sign In to add comment