Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Delegates et events dans singleton

3 réponses
Avatar
Delf
Bonjour.

J'ai une classe singleton : LoggerManager.

Ce singleton permet de maintenir en m=E9moire N Loggers qui sont
initialis=E9s =E0 partir d'un fichier <assemblyName>.dll.config.

Exemple d'utilisation :

LoggerManager.WriteLine("Core", LevelEnum.Debug, "CCore::Run",
"Debug...");

Via cette m=E9thode, je r=E9cup=E8re en interne le Logger ayant pour ID
"Core" et je fais le traitement WriteLine().

Chaque Logger a un =E9v=E8nement : OnWriteLine.

public delegate void WriteLineHandler(LoggerEventArgs e);

Et dans le code qui va lever l'=E9v=E8nement :

if (bWritten && this.OnWriteLine !=3D null)
{
this.OnWriteLine(new LoggerEventArgs(m_Id, currentDateTime,
pLevel, pEntryPoint, pMessage));
}

J'ai donc ajouter une m=E9thode au niveau de mon singleton pour "fixer"
un traitement sur cet event :

public static void SetWriteLineEvent(string pId,
Framework.IO.Logger.WriteLineHandler pCallback)
{
if (m_Loggers.ContainsKey(pId))
{
m_Loggers[pId].OnWriteLine +=3D new WriteLineHandler(pCallback);
}
}

=C7a fonctionne parfaitement.

J'ai aussi fait la m=E9thode inverse de d=E9tachement :

public static void UnsetWriteLineEvent(string pId,
Framework.IO.Logger.WriteLineHandler pCallback)
{
if (m_Loggers.ContainsKey(pId))
{
m_Loggers[pId].OnWriteLine -=3D new WriteLineHandler(pCallback);
}
}

Ce point ne fonctionne pas... j'intercepte toujours l'event :
OnWriteLine n'est jamais 'null'.
Je n'y comprends plus rien.

Toute indication sera la bienvenue, merci.

--
Delf

3 réponses

Avatar
Delf
On 10 juil, 12:09, Delf wrote:

[...]

Ça fonctionne parfaitement.

J'ai aussi fait la méthode inverse de détachement :

public static void UnsetWriteLineEvent(string pId,
Framework.IO.Logger.WriteLineHandler pCallback)
{
    if (m_Loggers.ContainsKey(pId))
    {
        m_Loggers[pId].OnWriteLine -= new WriteLineHandler(pCal lback);
    }

}

Ce point ne fonctionne pas... j'intercepte toujours l'event :
OnWriteLine n'est jamais 'null'.
Je n'y comprends plus rien.



Personne pour m'aider ?

--
Delf
Avatar
Delf
Je poste un peu plus de code.

LoggerManager.cs
---------------------------------------------------------------

using System;
using System.IO;
using System.Xml;

namespace Framework.IO.Logger
{
public class LoggerManager : LoggerManagerContext
{
private readonly static LoggerManager m_Instance = new
LoggerManager();

private LoggerManager() : base()
{
}

public static LoggerManager Instance
{
get
{
return m_Instance;
}
}
}
}

LoggerManagerContext.cs
---------------------------------------------------------------

using System;
using System.Xml;

namespace Framework.IO.Logger
{
public class LoggerManagerContext
{
private Loggers m_Loggers = null;

public LoggerManagerContext()
{
//...
}

public void SetWriteLineEvent(string pId,
Framework.IO.Logger.WriteLineHandler pCallback)
{
if (!this.IsEnabled)
{
Logger logger = m_Loggers[pId];

if (logger != null)
{
logger.OnWriteLine += new
WriteLineHandler(pCallback);
}
}
}

public void UnsetWriteLineEvent(string pId,
Framework.IO.Logger.WriteLineHandler pCallback)
{
if (!this.IsEnabled)
{
Logger logger = m_Loggers[pId];

if (logger != null)
{
logger.OnWriteLine -= new
WriteLineHandler(pCallback); // Ca ne fonctionne pas...
}
}
}
}
}
Avatar
Delf
Delf a utilisé son clavier pour écrire :

Je poste un peu plus de code.

[...]



Pas la même instance.
Résolu par :

logger.OnWriteLine += pCallback;

logger.OnWriteLine += pCallback;

--
Delf