2012-12-12 11 views
6

Sto scrivendo una libreria personalizzata che utilizza ServiceStack.Text internamente. Altre librerie che consumano le mie possono anche utilizzare ServiceStack.Text.È possibile estendere le impostazioni di ServiceStack.Text.JsConfig solo alla libreria?

Desidero modificare alcune opzioni JsConfig (in particolare la gestione della data), ma, come ogni buon cittadino, non voglio che le mie modifiche di tali valori causino effetti collaterali per il mio consumatore.

Sfortunatamente JsConfig è una classe statica, quindi le sue impostazioni sono statiche e salteranno ad altri utenti di ServiceStack nello stesso AppDomain che credo. Questo è un comportamento indesiderato.

Esiste un modo per applicare le modifiche alla configurazione solo alle mie chiamate allo JsonSerializer?

Aggiornamento

mi rendo conto c'è il metodo JsConfig.Reset, purtroppo se il chiamante ha personalizzato già, che andrebbero persi.

Potrei salvare i valori e ripristinarli, ma dovrei sincronizzare l'accesso al serializzatore, che anche tipo di sconfigge lo scopo.

Speriamo che ci sia qualcosa di semplice che mi manca?

risposta

14

Questa funzionalità mancava in ServiceStack.Text, quindi ho aggiunto un pull request per questo.

In sostanza ora se si voleva ambito le impostazioni di configurazione che è possibile utilizzare la seguente sintassi:

using(var config = JsConfig.BeginScope()) 
{ 
    config.DateHandler = ... 
} 

E non sarà più a impostare i valori una volta che il blocco utilizzando va fuori del campo di applicazione, la sua ThreadStatic pure in modo non influenzerà altri thread.

1

Una possibilità che ho è di utilizzare semplicemente un tipo personalizzato interno alla mia libreria come oggetto radice da serializzare e quindi specificare i valori JsConfig specificamente per quello.

internal class MyInternalObject { } 

JsConfig<MyInternalObject>.DateHandler = ... 

Non sono sicuro se i valori di configurazione della radice si propagano verso il basso per oggetti figlio nella serializzazione, ma abbastanza facile da testare.

+3

Sfortunatamente 'DateHandler' non è nella versione generica di questo tipo, quindi non funzionerà. –

Problemi correlati