Implementacija DA layer-a (C#)
Prikazujem rezultate 1 do 10 od 10

Tema: Implementacija DA layer-a (C#)

  1. #1
    Iskusan frederikrr (avatar)
    Učlanjen
    29.11.2016.
    Pol
    muški
    Poruke
    5.454
    Tekstova u blogu
    2
    Reputaciona moć
    126

    Podrazumevano Implementacija DA layer-a (C#)

    1. DEO

    Posto se cesto postavljaju razna pitanja oko toga kako upisati nesto u bazu podataka, kako ovo, kako ono, rekoh da podelim ovde jedan generalni primer dobre prakse kako implementirati DA layer.
    Ovde cu dati primer za dve vreste baze podataka (MS SQL, i Firebird), a videcete kako dalje vrlo lako sami mozete da implementirate za bilo koju drugu bazu podataka (jednostavnim nasledjivanjem).
    Pa, da pocnemo:

    1. Kreirajte interfejs, gde cete opisati neophodne funkcije.

    Kod:
    public interface IUpdatesDA
    {
            IUpdatesScope GetScope();
            bool Login(IUpdatesScope updatesScope, string userName, string password, out AccountData accountData, out Guid sessionGuid);
            bool SelectSomething(IUpdatesScope, Guid sessionGuid, int someID, out MyDatabaseData myDatabaseData);
            bool InsertSomething(IUpdatesScope updatesScope, Guid sessionGuid, DataToInsert dataToInsert);
    }
    2. Kreirajte interfejs za vas database Scope, koji ce biti nista drugo do implementacija IDisposable interfejsa.

    Kod:
    public interface IUpdatesScope : IDisposable
    {
    }
    3. Implementirajte interfejs IUpdatesScope, za dve navedene baze podataka:

    - MS SQL:

    Kod:
    public class MSSqlUpdatesScope : IUpdatesScope
        {
            public MSSqlUpdatesScope(string connectionString)
            {
                Connection = new SqlConnection(connectionString);
                Connection.Open();
            }
    
            ~MSSqlUpdatesScope()
            {
                Dispose(false);
            }
    
            public SqlConnection Connection { get; internal set; }
    
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
    
            protected virtual void Dispose(bool disposing)
            {
                if (!disposing)
                    return;
    
                if (Connection == null)
                    return;
    
                Connection.Dispose();
                Connection = null;
            }
        }
    - Firebird db:
    Kod:
    public class FirebirdUpdatesScope : IUpdatesScope
        {
            public FbConnection Connection { get; internal set; }
    
            public FirebirdUpdatesScope(string connectionString)
            {
                Connection = new FbConnection(connectionString);
                Connection.Open();
            }
    
            ~FirebirdUpdatesScope()
            {
                Dispose(false);
            }
        
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(this);
            }
    
    
            // The bulk of the clean-up code is implemented in Dispose(bool)
            protected virtual void Dispose(bool disposing)
            {
                if (!disposing) 
                    return;
    
                if (Connection == null) 
                    return;
    
                Connection.Dispose();
                Connection = null;
            }
        }
    Napomena: ne zaboravite da dodate using klauzule za sve sto ce vam trebati, i adekvatne reference.
    Poslednji put ažurirao/la frederikrr : 30.01.2018. u 15:25
    “Float like a butterfly, sting like a bee. The hands can't hit what the eyes can't see.”



  2. #2
    Iskusan frederikrr (avatar)
    Učlanjen
    29.11.2016.
    Pol
    muški
    Poruke
    5.454
    Tekstova u blogu
    2
    Reputaciona moć
    126

    Podrazumevano Re: Implementacija DA layer-a (C#)

    2. DEO: Implementacija IUpdateDA interfejsa i konkretna manipulacija sa bazom podataka.

    Sada je na redu da implementiramo nas interfejs, odnosno njegove funkcije u konkretnim klasama:

    - MSSQL:

    Kod:
    public class MSSqlUpdatesDA : IUpdatesDA
    {
        public string ConnectionString { get; set; }
        
        public MSSqlUpdatesDA(string connectionString)
        {
            ConnectionString = connectionString;
        }
    
        public IUpdatesScope GetScope()
        {
            return new MSSqlUpdatesScope(ConnectionString);
        }
        public bool Login(IUpdatesScope updatesScope, string userName, string password, out AccountData accountData, out Guid sessionGuid)
        {
                sessionGuid = Guid.Empty;
                accounDatat = null;
    
                var scope = updatesScope as MSSqlUpdatesScope;
                if (scope == null)
                    return false;
    
                using (var command = scope.Connection.CreateCommand())
                {
                    command.CommandText = "OVDE IDE TEKST KLASICNE SQL KOMANDE";
    
                    command.Parameters.Add(new SqlParameter("UserName", userName));  // Ovde dodajemo parametre 
                    command.Parameters.Add(new SqlParameter("Password", password));
    
                    using (var reader = command.ExecuteReader())  // i ovde izvrsavamo nasu komandu
                    {
                        if (!reader.Read())
                            return false;
    
                        sessionGuid = Guid.NewGuid();
                        accountData = new AccountData
                        {
                           // OVDE SETUJEMO ACCOUNT DATA, NA OSNOVU ONOGA STO SMO DOBILI KAO REZULTAT IZVRSENJA KOMANDE
                           Id = (int)reader.Get<long>("ID"),
                           UserName = reader.Get<string>("USERNAME"),
                           UserGroup = reader.Get<string>("USERGROUP")
                        };
    
                        return account.Id > 0 && false;
                    }
                }
        }
            
       // DALJE IDE IMPLEMENTACIJA OSTALIH FUNKCIJA
    
    }
    Da ne ponavljam, gotovo je identicno za Firebird database.

    Postoji jos puno dobrih primera, ovo je jedan koji ja cesto koristim u real sistemima (i to samo krnji deo cele price).

    To je ukratko, sto se tice DA layer-a.
    Sledeci stadijum je implementacija BL (Business Layer-a), koji ce konzumirati ovaj sloj.
    Kako cete implementirati BL, zavisi najvise od toga da li je pravite web service, ili bazi pristupate direktno iz neke klijentske (desktop) aplikacije.

    Pretpostavimo da je ovo drugo u pitanju, onda ce vam trebati samo jedna DataProvider klasa, koja ce odluciti koju instancu da kreira (u zavisnosti koju bazu koristite), i jedan DataManager, koji ce pripremiti podatke prikupljene od UI-a, odnosno pripremiti podatke za UI (ili za neki lokalni storage, ili sta god).
    Poslednji put ažurirao/la frederikrr : 30.01.2018. u 15:27
    “Float like a butterfly, sting like a bee. The hands can't hit what the eyes can't see.”

  3. #3
    Zainteresovan član
    Učlanjen
    14.11.2014.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    184
    Reputaciona moć
    15

    Podrazumevano Re: Implementacija DA layer-a (C#)

    Meni ovo sa dispose vise lici na workaround deficijencije C# nego nesto sto generalno moze da upotrebi
    Ja sam negde 2000 radio serijalizaciju u C++ gde je reader/writer interfejs odvojen od samog kreiranja objekta, pa sam mogao recimo db_stream >> object_list ili db_stream << object_list ili file_stream ili rpc_stream itd...
    Mada imas Entity framework za C# pa ti to nije ni potrebno ;p
    press any key to continue or any other to quit...

  4. #4
    Iskusan frederikrr (avatar)
    Učlanjen
    29.11.2016.
    Pol
    muški
    Poruke
    5.454
    Tekstova u blogu
    2
    Reputaciona moć
    126

    Podrazumevano Re: Implementacija DA layer-a (C#)

    Citat Original postavio bmaxa Pogledaj poruku
    Meni ovo sa dispose vise lici na workaround deficijencije C# nego nesto sto generalno moze da upotrebi
    Ja sam negde 2000 radio serijalizaciju u C++ gde je reader/writer interfejs odvojen od samog kreiranja objekta, pa sam mogao recimo db_stream >> object_list ili db_stream << object_list ili file_stream ili rpc_stream itd...
    Mada imas Entity framework za C# pa ti to nije ni potrebno ;p
    Nisam zavrsio implementaciju, ovo je skraceni primer. Pun primer podrazumeva kreiranje instanci objekata koji implementiraju interfejse, putem Dependency Injection-a, tako da je zato implementacija IDisposable interfejsa obavezna. Inace, u pravu si, nije.
    A Entity Framework je super stvar za velike stvari, velike podatke, i pogotovo za one koji se ne menjaju cesto.
    Za male stvari, ceste sitne update-ove, je totalni overkill. Merili smo performanse, i veruj mi, od 2 do 5 puta brze radi direktan pristup, pogotovo ako lepo pripremis sve parametre komandi
    “Float like a butterfly, sting like a bee. The hands can't hit what the eyes can't see.”

  5. #5
    Zainteresovan član
    Učlanjen
    14.11.2014.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    184
    Reputaciona moć
    15

    Podrazumevano Re: Implementacija DA layer-a (C#)

    Ok, kad sam odgovarao nisam video ni tvoj drugi post, nesto je izgleda kasnilo
    press any key to continue or any other to quit...

  6. #6
    Elita pivosok (avatar)
    Učlanjen
    24.01.2010.
    Pol
    muški
    Lokacija
    Osmanlı İmparatorluğu
    Poruke
    16.113
    Reputaciona moć
    322

    Podrazumevano Re: Implementacija DA layer-a (C#)

    vidi se da si pravi programer. Ja sam uvek mrzeo da pisem komentare. A uciteljica je insistirala na tome.
    "There are three signs of senility. The first sign is that a man forgets his theorems. The second sign is that he forgets to zip up. The third sign is that he forgets to zip down. "

  7. #7
    Iskusan frederikrr (avatar)
    Učlanjen
    29.11.2016.
    Pol
    muški
    Poruke
    5.454
    Tekstova u blogu
    2
    Reputaciona moć
    126

    Podrazumevano Re: Implementacija DA layer-a (C#)

    A, ne pisem ni ja u pravom kodu, pisem ovde zbog objasnjenja. Inace je pravilo clean code-a da se ne pisu komentari.
    “Float like a butterfly, sting like a bee. The hands can't hit what the eyes can't see.”

  8. #8
    miki208 nije na forumu
    Ponekad ljudi za koje to niko ne bi pomislio, mogu da urade nesto sto niko ne moze da zamisli.
    Moderator miki208 (avatar)
    Učlanjen
    21.01.2010.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    2.274
    Reputaciona moć
    103

    Podrazumevano Re: Implementacija DA layer-a (C#)

    Citat Original postavio frederikrr Pogledaj poruku
    A, ne pisem ni ja u pravom kodu, pisem ovde zbog objasnjenja. Inace je pravilo clean code-a da se ne pisu komentari.
    Upravo...

    Dobro imenovanje metoda i promenljivih u skladu sa njihovim ponasanjem/namenom, i refaktorisanje, i kod govori sam za sebe
    Uvek budi ono sto zaista jesi, pa cak iako odstupas od ostalih. Lepota je razlikovati se.

  9. #9
    Zainteresovan član
    Učlanjen
    14.11.2014.
    Pol
    muški
    Lokacija
    Beograd
    Poruke
    184
    Reputaciona moć
    15

    Podrazumevano Re: Implementacija DA layer-a (C#)

    Pa dobro, nije zgoreg ubaciti koji komentar tu i tamo, a imamo i doxygen ;p
    press any key to continue or any other to quit...

  10. #10
    Iskusan frederikrr (avatar)
    Učlanjen
    29.11.2016.
    Pol
    muški
    Poruke
    5.454
    Tekstova u blogu
    2
    Reputaciona moć
    126

    Podrazumevano Re: Implementacija DA layer-a (C#)

    Da, to je vec drugo, ubacivati komentare (u vidu opisnih atributa) koje generatori dokumentacije koriste, je cool stvar. Pre par godina sam nesto slicno doxygen-u koristio da dokumentujem neke web servise, i prilicno je cool. Ali nema teoretske sanse da se setim sta sam koristio, stize me alzhajmer polako
    “Float like a butterfly, sting like a bee. The hands can't hit what the eyes can't see.”

Slične teme

  1. Naucna fantastika i implementacija iste u RL-u...
    Autor Džek svih zanata u forumu Književnost i jezik
    Odgovora: 24
    Poslednja poruka: 26.01.2009., 18:30
  2. DVD Double Layer ? + koji player?
    Autor TajRad u forumu Hardver
    Odgovora: 7
    Poslednja poruka: 31.12.2005., 17:54
  3. Draw Layer i nasa slova
    Autor djix u forumu Web dizajn
    Odgovora: 1
    Poslednja poruka: 16.08.2005., 13:11
  4. ASPI layer
    Autor mbScorpio u forumu Softver
    Odgovora: 2
    Poslednja poruka: 14.04.2005., 00:01
  5. Layer se pojavi na click
    Autor leZ u forumu Web dizajn
    Odgovora: 4
    Poslednja poruka: 02.11.2003., 23:42

Pravila za slanje poruka

  • Ne možete kreirati novu temu
  • Ne možete poslati odgovor
  • Ne možete dodati priloge
  • Ne možete prepraviti svoju poruku
  •