Sto scrivendo una libreria di registrazione centrale. In esso è presente un attributo del metodo AutoLogAttribute
che registra automaticamente la voce / uscita dei metodi e i relativi parametri (serializzati automaticamente) come segue:
[AutoLog]
public void GenerateInvoice(string customerId)
{
...
}
// Outputs
// af8291: Entering GenerateInvoice with parameters: { customerId: 'GZilla' }
// af8291: Exited GenerateInvoice. Ellapsed time: 480.12 ms
Il mio problema sorge quando i parametri sono POJO che serializzano su stringhe enormi.
Per impostazione predefinita, voglio semplicemente ignorare eventuali non primitivi e consentire agli utenti di specificare in che modo richiedere la serializzazione.
È importante notare che poiché la maggior parte degli oggetti sono POJO nel mio caso, non posso iniziare a richiedere l'estensione di un'interfaccia come ILoggable
. Anche estendere ToString()
è indesiderabile perché idealmente un oggetto dovrebbe essere ricostruibile da esso.
Stavo pensando di consentire agli utenti di aggiungere trasformatori di stringhe di oggetti personalizzati a un campo elenco statico globale in AutoLogAttribute
(ad esempio, in un codice di inizializzazione della loro app). So che questa è una pessima pratica. La mia domanda è, c'è un modo migliore per risolvere il mio problema?
public class AutoLogAttribute
{
// something like this
public static Dictionary<Type,Func<object,string>> ParameterTransformers { get; private set; }
...
}
public class Program
{
public static void Main(string[] args)
{
AutoLogAttribute.ParameterTransformers[Customer.Type] = (c) => c.Id;
AutoLogAttribute.ParameterTransformers[Order.Type] = (o) => o.OrderNumber;
...
}
[AutoLog]
public void ProcessOrder(Customer customer, Order order)
{
...
}
}