Ohjelmointi

Kuinka toteuttaa yksinkertainen kirjaaja C #: ssä

Haluat usein kirjata tapahtumia tai virheitä, kun ne tapahtuvat .Net-sovelluksessasi. Tätä varten voit hyödyntää yhtä monista käytettävissä olevista suosituista puunkorjuukehyksistä tai suunnitella ja kehittää oman puunkorjuukehyksesi. Tässä artikkelissa kerrotaan, kuinka voimme suunnitella ja kehittää oman puunkorjuukehyksemme helposti, ja käydä läpi vaiheet yksinkertaisen loggerin rakentamiseksi C #: een.

Ensinnäkin sinun on ymmärrettävä lokikohteet - eri paikat, joihin tiedot voidaan kirjata. Oletetaan, että kirjaamme tiedot tasaisiin tiedostoihin, tietokantaan ja tapahtumalokiin. Seuraava luettelo määrittelee lokikohteet, joita käytämme tässä yksinkertaisessa kehyksessä.

public enum LogTarget

    {

Tiedosto, Tietokanta, Tapahtumaloki

    }

C # logger -luokat

Seuraava vaihe on suunnitella ja toteuttaa luokat. Käytämme kolmea erillistä luokkaa - nimittäin FileLogger, DBLoggerja EventLogger- kirjata tiedot tiedostoon, tietokantaan ja tapahtumalokiin. Kaikkien näiden luokkien tulisi periä nimetty abstrakti perusluokka LogBase. Näin nämä luokat järjestetään.

  julkinen abstrakti luokka LogBase

    {

public abstract void Loki (merkkijonoviesti);

    }

public class FileLogger: LogBase

     {

public string filePath = @ ”D: \ Log.txt”;

public override void Log (merkkijonoviesti)

        {

käyttäen (StreamWriter streamWriter = uusi StreamWriter (filePath))

            {

streamWriter.WriteLine (viesti);

streamWriter.Close ();

            }           

        }

    }

julkisen luokan DBLogger: LogBase

    {

merkkijono connectionString = merkkijono.Tyhjä;

public override void Log (merkkijonoviesti)

        {

// Koodi tietojen kirjaamiseksi tietokantaan

        }

    }

public class EventLogger: LogBase

    {

public override void Log (merkkijonoviesti)

        {

EventLog eventLog = uusi EventLog (“”);

eventLog.Source;

eventLog.WriteEntry (viesti);

        }

    }                                

Olen jättänyt DBLogger luokka keskeneräinen. Jätän sinun täyttää asianmukainen koodi viestiesi kirjaamiseksi tietokantaan.

Kuten näette, kaikki kolme luokkaa - FileLogger, EventLoggerja DBLogger - laajentaa abstraktia perusluokkaa LogBase. Abstrakti perusluokka LogBase julistaa kutsutun abstraktin menetelmän Hirsi(). Hirsi() method hyväksyy merkkijonon parametriksi; tämä merkkijono kirjataan tiedostoon, tietokantaan tai tapahtumalokiin.

C # LogHelper -luokka

Luodaan nyt auttajaluokka, jota voidaan käyttää vastaavan tiedonkeruun käynnistämiseen parametrin perusteella. Tätä auttajaluokkaa käytetään yksinkertaistamaan puhelut Hirsi() -menetelmää kussakin logger-luokassa. Seuraava koodinpätkä kuvaa tätä auttajaluokkaa.

julkinen staattinen luokka LogHelper

    {

yksityinen staattinen LogBase-kirjaaja = null;

public static void Log (LogTarget-kohde, merkkijonoviesti)

        {

kytkin (kohde)

            {

tapaus LogTarget.File:

logger = uusi FileLogger ();

logger.Log (viesti);

tauko;

tapaus LogTarget.Database:

logger = uusi DBLogger ();

logger.Log (viesti);

tauko;

tapaus LogTarget.EventLog:

logger = uusi EventLogger ();

logger.Log (viesti);

tauko;

oletus:

palata;

            }

        }

    }

Hirsi() menetelmä LogHelper luokka hyväksyy merkkijonon ja LogTarget luettelo parametreina. Sitten se käyttää a kytkin: kotelo rakentaa määrittämään kohde, johon tekstiviesti kirjataan.

Synkronoidaan puhelut C # Log -menetelmään

Oho! Unohdimme synkronoida puhelut vastaaviin Hirsi() menetelmiä. Tätä varten meidän on käytettävä lukitusavainsanaa Hirsi() kunkin logger-luokan menetelmä ja sisällytä sopiva koodi niiden synkronointiinHirsi() menetelmiä. Viittaavat LogBase luokassa. Olemme liittäneet suojatun jäsenen, jota käytetään lukon kiinnittämiseen Hirsi() kunkin johdetun luokan menetelmä. Tässä ovat näiden luokkien muokatut versiot.

julkinen abstrakti luokka LogBase

    {

suojattu vain luku -objekti lockObj = uusi objekti ();

public abstract void Loki (merkkijonoviesti);

    }

public class FileLogger: LogBase

    {

public string filePath = @ ”D: \ Log.txt”;

public override void Log (merkkijonoviesti)

        {

lukko (lockObj)

            {

käyttäen (StreamWriter streamWriter = uusi StreamWriter (filePath))

                {

streamWriter.WriteLine (viesti);

streamWriter.Close ();

                }

            }

        }

    }

public class EventLogger: LogBase

    {

public override void Log (merkkijonoviesti)

        {

lukko (lockObj)

            {

EventLog m_EventLog = uusi EventLog (“”);

m_EventLog.Source;

m_EventLog.WriteEntry (viesti);

            }

        }

    }

julkisen luokan DBLogger: LogBase

    {

merkkijono connectionString = merkkijono.Tyhjä;

public override void Log (merkkijonoviesti)

        {

lukko (lockObj)

            {

// Koodi tietojen kirjaamiseksi tietokantaan

            }

        }

    }

Voit nyt soittaa Hirsi() menetelmä LogHelper luokka ja välitä lokikohde ja tekstiviesti kirjautumaan parametreina.

luokan ohjelma

    {

staattinen void Main (merkkijono [] args)

        {

LogHelper.Log (LogTarget.File, “Hei”);

        }

    }

Jos joudut koskaan kirjaamaan tekstiviestin toiseen lokikohteeseen, välität yksinkertaisesti oikean lokikohteen parametrina Hirsi() menetelmä LogHelper luokassa.

Voit parantaa tätä kirjauskehystä monilla tavoilla. Voit toteuttaa asynkronian ja jonon niin, että kun saapuu suuri määrä viestejä, kirjaaja voi käsitellä näitä viestejä asynkronisesti ilman, että sinun on estettävä nykyistä ketjua. Saatat myös haluta ottaa käyttöön viestien kriittisyystasot, kuten informaatioviestit, varoitusviestit, virheilmoitukset ja niin edelleen.

$config[zx-auto] not found$config[zx-overlay] not found