Jade-ERP #4 – Dane z bazy

Miniony tydzień ponownie jak poprzedni miałem wypełniony po brzegi, przez co ponownie niewiele udało mi się dodać do projektu. Zdecydowanie muszę bardziej skupić się na poprawieniu zarządzaniu swoim czasem, aby projekt ruszył z miejsca.  Plan na najbliższy tydzień – poświęcić więcej czasu na rozwinięcie projektu.

 

Zmiany

Przedstawię to, co udało mi się zaimplementować w ostatnich dniach.

Dodałem klasę bazową dla modeli widoków list (kontrahentów, towarów etc.). Jako że wszystkie listy w widokach muszą coś wyświetlić (co wydaje się całkiem logiczne 😊 ), więc pobranie danych z bazy i utworzenie listy przeniosłem właśnie do wspólnej dla list klasy bazowej. W jaki sposób zarządzam rodzajem pobieranych danych? Oto konstruktor TableViewModel:

public TableViewModel(Type enityType)
{
    var ex = typeof(DatabaseAccessService);
    var mi = ex.GetMethod("GetEntities");
    var miConstructed = mi.MakeGenericMethod(enityType);
    var itemList = miConstructed.Invoke(DatabaseAccessService.Current, null) as IList;

    if (itemList != null)
        foreach (var o in itemList)
            Items.Add(o);
}

 

Za chwilę wyjaśnię cel skorzystania z refleksji. Tymczasem przedstawię klasę do pobierania danych z bazy danych na podstawie typu obiektu, który chcemy uzyskać:

public class DatabaseAccessService
{
    private readonly ERPDatabaseEntities _database = ConnectionHelper.CreateConnection();

    public DatabaseAccessService()
    {
        if (Current != null)
            throw new Exception($"Only one instance of {nameof(DatabaseAccessService)} can exists!");

        Current = this;
    }

    public static DatabaseAccessService Current { get; private set; }

    public List<T> GetEntities<T>() where T : class
    {
        var value = _database.GetType().GetProperty(typeof(T).Name).GetValue(_database, null);
        var obj = value as DbSet<T>;

        return new List<T>(obj);
    }

    public void AddEntities<T>(T entity) where T : class
    {
        var value = _database.GetType().GetProperty(typeof(T).Name).GetValue(_database, null);
        var obj = value as DbSet<T>;
    }

}

 

Dzięki użyciu metod generycznych posiadam uniwersalny mechanizm do pobierania lub dodawania danych dowolnego (przynajmniej teraz tak uważam) typu z i do bazy! Dlaczego korzystam z refleksji w konstruktorze  TableViewModel? Zwróć, proszę uwagę, że do konstruktora przekazuje pewien typ. Z jego pomocą muszę wywołać generyczną metodę GetEntities z klasy DatabaseAccessService. Niestety nie mogę tak po prostu przekazać parametru konstruktora do metody generycznej. Dość długo zastanawiałem się nad rozwiązaniem tego problemu – jak zwykle StackOverflow przyszedł z pomocą. Jeżeli znasz inny sposób niż korzystanie z refleksji, zapraszam do podzielenia się tym w komentarzu – jestem ciekawy czy istnieje inne rozwiązanie.

 

Słów kilka na koniec

W zasadzie jest to jedyny większy mechanizm, który dodałem do projektu. Pozostałe zmiany polegały na dodaniu drobnych klas pomocniczych oraz refaktoryzacji istniejącego kodu.

Mam coś dla Ciebie

Zapisz się do mojego newslettera, a ja prześlę Ci zbiór kilkunastu praktycznych wskazówek dla programisty aplikacji mobilnych.

Menu