2008-09-27 11 views
6

Actualmente estoy escribiendo una interfaz para permitir que las aplicaciones envíen datos de excepción a un depósito central para fines de soporte. Estoy en un dilema sobre cómo pasar datos adicionales contextual:IDictionary <cadena, cadena> o NameValueCollection

public interface IExceptionNotifier 
{ 
    void Notify(Exception ex, NameValueCollection context); //this  
    void Notify(Exception ex, IDictionary<string, string> context); //or this 
} 

menudo me he encontrado es una posición similar cuando se crean las búsquedas. Ignorando si el concepto de notificador de excepción es bueno o no, ¿es mejor utilizar un IDictionary<string, string> o NameValueCollection? ¿Por qué escogerías uno sobre el otro?

Respuesta

1

Si el contexto es un valor desechable y (aquí viene la parte importante) no será serializado, p. para enviar los datos a otro sistema, me gustaría ir con IDictionary porque hace que el uso de su interfaz sea más flexible.

Si, por otro lado, el contexto se mantiene todo el tiempo o el contexto se serializará, utilice NameValueCollection porque entonces usted está bajo control de lo que realmente obtendrá de la persona que llama.

Editar: mausch es justo en el sentido de que debe usar un enfoque genérico, pero aún no utilizaría una interfaz si desea serializar los datos.

+0

¿Podría ampliar "bajo control de lo que realmente obtendrá de su interlocutor"? ¿Es la posibilidad de que una persona que llama el envío de claves duplicadas el problema? Supongo que no entiendo por qué evitarías un diccionario si se trata de serialización. –

+1

@JeffBridgman: Esto fue hace casi diez años, realmente no recuerdo lo que quise decir;) Supongo que se trata de obtener un objeto de una clase específica (es decir, con ciertas restricciones como soporte de serialización), o de obtener * cualquier cosa * con una cierta interfaz. Por ejemplo, la implementación de IDictionary puede no admitir la serialización o algunos métodos, mientras que NameValueCollection es una implementación fija, por lo que depende de lo que quiera hacer con el contexto. Tenga en cuenta que hay varias otras preguntas sobre esto en SO con discusiones interesantes. – OregonGhost

5

(Suponiendo .NET 3.5 aquí. Pre .NET 3.5, NameValueCollection tendría la ventaja de ser capaz de atar múltiples valores a una tecla y sin equivalente directo en colecciones "normales".)

¿Quieres claves para tener potencialmente valores múltiples? Si es así, consideraría ILookup < TKey, TValue>. De lo contrario, iría por IDictionary < TKey, TValue>.

Aparte de cualquier otra cosa, si el receptor quiere hacer ningún tipo de procesamiento, donde LINQ sería de utilidad para ellos, cualquiera de las interfaces genéricas va a ser mejor que NameValuePair. Asimismo, puede ser más fácil para quien llama producir un diccionario/búsqueda utilizando LINQ si ya tienen un tipo de contexto genérico o dinámico.

Cuestiones relacionadas