/AutoSource

Alternativa a BindingSource para bases de datos particulares.

Primary LanguageC#GNU Affero General Public License v3.0AGPL-3.0

AutoSource

Es una libreria que provee una plantilla del componente BindingSource, pero que expone metodos simples, pensado para esos proyectos pequeños que no van a usar una bases de datos dedicada y que, por ejemplo, usen un diccionario escrito como json en el disco; pero que igualmente se puedan beneficiar de enlazado de datos.

Los beneficios de usar un AutoSource en comparacion a un BindingSource tradicional, es que este ultimo hay que configurarlo cada vez que se agrega a un formulario, en cambio un AutoSource se programa una sola vez y ya se puede usar en tu aplicación, solo queda enlazar controles desde el diseñador.

Aqui un ejemplo de un AutoSource que esta enlazado a diccionario que es persistido en un archivo de texto usando Newtonsoft.Json

using AutoSource.AutoSourceSystem;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace AutoSource
{
    public class TestObject
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
        public string Phone { get; set; }
    }

    public class TestSource : AutoSource<TestObject>
    {
        private readonly string archivo = "datos.json";
        private Dictionary<int, TestObject> db;

        protected override void BorrarItemEnDB(TestObject a)
        {
            db.Remove(a.Id);
            File.WriteAllText(archivo, JsonConvert.SerializeObject(db, Formatting.Indented));
        }

        protected override int CrearItemEnDB(TestObject a)
        {
            var id = a.Id;
            db.Add(id, a);
            File.WriteAllText(archivo, JsonConvert.SerializeObject(db, Formatting.Indented));
            return id;
        }

        protected override TestObject ObtenerItemDesdeDB(TestObject a)
        {
            if (db.TryGetValue(a.Id, out TestObject b))
            {
                return b;
            }
            return null;
        }

        protected override string ObtenerNombre(TestObject a) => $"{a.Id} - {a.Name} - {a.Address}";

        protected override string ObtenerNombrePropiedadID() => nameof(TestObject.Id);

        protected override IEnumerable<TestObject> ObtenerTodosLosItemsDesdeDB()
        {
            if (db == null)
            {
                if (File.Exists(archivo))
                {
                    db = JsonConvert.DeserializeObject<Dictionary<int, TestObject>>(File.ReadAllText(archivo));
                }
                else
                {
                    db = new Dictionary<int, TestObject>();
                }
            }
            return db.Values.Select(x => CrearCopia(x));
        }

        protected override void SubirModificacionesADB(TestObject a)
        {
            db[a.Id] = CrearCopia(a);
            File.WriteAllText(archivo, JsonConvert.SerializeObject(db, Formatting.Indented));
        }
    }
}