Problemy z powiązaniami między projektami

0

Cześć,

piszę sobie obsługę błędów (logowanie). W solucji jest ok. 30 projektów, ja chce dodać swój właśnie z logowaniem błędów do DB.
Problem jest taki, że Obsługa DB jest przykładowo w projekcie DB, więc mam do mojego projektu z logami zrobioną referencję. Wszystko działa ok, dopóki nie chcę dodać logu z projektu z DB. Wtedy dostaję informację, że zrobiła się pętla referencji.

Gdzie jest błąd w moim myśleniu?

Klasa Log.cs:


using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace Logger
{
    public class Log
    {
        /// <summary>
        /// Moduł,w  którym wystąpił błąd
        /// </summary>
        public string UID;

        /// <summary>
        /// Moduł,w  którym wystąpił błąd
        /// </summary>
        public string Modul;

        /// <summary>
        /// StackTrace błędu
        /// </summary>
        public string StackTrace;

        /// <summary>
        /// Wiadomość (Exception.Message)
        /// </summary>
        public string Wiadomosc;

        /// <summary>
        /// Konstruktor
        /// </summary>
        public Log()
        {}

        /// <summary>
        /// Konstruktor z <see cref="Dictionary"/>
        /// </summary>
        public Log(Dictionary<string, string> logDict)
        {
            this.Modul = logDict["modul"];
            this.StackTrace = logDict["stackTrace"];
            this.Wiadomosc = logDict["Wiadomosc"];
        }

        public void DodajLog(Exception ex)
        {
            this.StackTrace = ex.StackTrace;
            this.Wiadomosc = ex.Message;
            this.Modul = ex.Source;

            var logsDict = new Dictionary<string, string>
            {
                { "modul", this.Modul },
                { "stackTrace", this.StackTrace },
                { "Wiadomosc", this.Wiadomosc }
            };

            this.UID = new CDaoLogger().ZapiszLog(logsDict);
            if (!String.IsNullOrEmpty(this.UID))
                WyswietlInformacje(this.UID);
        }

        /// <summary>
        /// Wyświetla informacje o błędzie użytkownikowi
        /// </summary>
        /// <param name="UID">Unikalny identyfikator błędu</param>
        private void WyswietlInformacje(string UID)
        {
            MessageBox.Show(String.Format("Wystąpił niespodziewany błąd. Spróbuj ponownie. Jeżeli problem będzie się powtarzał - skontaktuj się z administratorem i podaj identyfikator błędu: {1}{0}", UID, Environment.NewLine),
                "Houston, mamy problem",
                MessageBoxButtons.OK,
                MessageBoxIcon.Error);
        }
    }

}

Klasa CDao:

using Ripper.Businesslogic.Dao;
using Ripper.Dao;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;


namespace Logger
{
    public class CDaoLogger : Connection
    {
        public string ZapiszLog(Dictionary<string,string> log)
        {
            DataTable dt = new DataTable();
            string UID = String.Empty;
            Log logItem = new Log(log);

            CDaoAutoryzacja daoUser = new CDaoAutoryzacja();
            GenericPermissions.PermissionManager pm = daoUser.getPermissionManager();
            int UserId = Convert.ToInt32(pm.getCurrentlyLoggedUser().GeUserId);

            Hashtable htParametry = new Hashtable
                {
                    { "@lg_modul", logItem.Modul },
                    { "@lg_stackTrace", logItem.StackTrace },
                    { "@lg_wiadomosc", logItem.Wiadomosc },
                    { "@lg_us_id", UserId }
                };
            try
            {
                this.Open();
                DataRow dr = Helpers.PobierzWiersz("[dbo].[Logs_dodaj]", htParametry);
                if (dr != null)
                    UID = Convert.ToString(dr[0]);

            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.ToString());
            }
            finally
            {
                if (this.SqlTran == null && this.SqlConn != null)
                {
                    this.Close();
                }
            }
            return UID;
        }


    }

}
0

Musisz wyabstrachowac logowanie albo perzystencję. Wtedy np. Twój log będzie implementował interfejs logowania, zadeklarowany w projekcie który nie będzie miał bezpośrednich referencji do innych projektów w systemie. Następnie wszędzie gdzie będziesz potrzebował logowania używaj abstrakcji, a jedyne miejsce gdzie zepniesz abstrakcje z implementacja będzie punkt wejściowy do aplikacji/systemu.

0
Aventus napisał(a):

Musisz wyabstrachowac logowanie albo perzystencję. Wtedy np. Twój log będzie implementował interfejs logowania, zadeklarowany w projekcie który nie będzie miał bezpośrednich referencji do innych projektów w systemie. Następnie wszędzie gdzie będziesz potrzebował logowania używaj abstrakcji, a jedyne miejsce gdzie zepniesz abstrakcje z implementacja będzie punkt wejściowy do aplikacji/systemu.

Dzięki za odpowiedź, czy mógłbyś przedstawić jakiś prosty przykład ;)?

1 użytkowników online, w tym zalogowanych: 0, gości: 1