giovedì 18 aprile 2013

How To: Full generic Data Adapter.

Parafrasandomi...
L'astrazione del dato è tutto !!

In questo caso mi sono divertito a comprendere se e come fosse possibile arrivare ad  al "limite dell'astrazione".

Partimao da quest'interfaccia, che al momento non serve ma torna comoda. L'idea è di relizzare un raggruppatore di classi entità.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAbstraction.Data
{
    public interface IEntity<K>
    {
        public K key { get; }
    }
}


E queste le mie classiche entintà che come al solito non si discostano di molto dai miei classici esempi.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAbstraction.Data
{
    public class Category:IEntity<int>        
    {
        public int id { get; set; }
        public string Name { get; set; }
        public string Descripiton { get; set; }
     
        public int key
        {
            get { return id; }
        }       
    }

    public class Friend:IEntity<int>        
    {
        public int id { get; set; }
        public string Surname { get; set; }
        public string Name { get; set; }
        public Category category { get; set; }

        public int key
        {
            get { return id; }
        }
    }
}

Rispetto allo standard ( sempre del mio blog ) questa è la prima novità, quest'interfaccia ammetto che sembra di dubbia utilità in realtà è questa a reliazzare il salto fra chi gestisce i dati e chi li usa.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DataAbstraction.Provider
{
    public interface IDataProvider<T>
    {
        List<T> context { get; set; }
        void Insert(T t);
        void Edit(T n, T o);
        void Delete(T t);
        List<T> Select();
    }
}

Ed ecco il gioiellino "il mio nuovo generic dataAdapter" a cui posso far fare quasi tutto ...
L'unica cosa e che per non sfruttare "reflection" che mi potrebbe ammazzare le prestazioni ho dovuto gestire l'edit un un modo un pò bruso, per andare mi serve necessariamente l'item modificato, e il vecchio item. Non escludo qualche evoluzione di questo in futuro, ma penso di essere arrivato ad un buon compromesso, non ho tipi "fissi".
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAbstraction.Data;

namespace DataAbstraction.Provider
{
    public class DataProvider<T>:IDataProvider <T>
    {
        List<T> context { get; set; }

        public void Insert(T t)
        {
            context.Add(t);
        }

        public void Edit(T n, T o)
        {
            for (int i = 0; i < context.Count(); i++)
            {
                if (context[i].Equals(o))
                {
                    context[i] = n;
                }
            }
        }

        public void Delete(T t)
        {
            context.Remove(t);
        }

        public List<T> Select()
        {
            return context;
        }
    }
}

Nessun commento: