2008-09-27 6 views
6

현재 응용 프로그램이 지원을 위해 예외 데이터를 중앙 리포지토리에 보낼 수 있도록 인터페이스를 작성하고 있습니다. 나는 여분의 문맥 데이터를 전달하는 방법에 대한 곤경에있어 : ​​IDictionary <string, string> 또는 NameValueCollection

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

나는 종종 조회를 만들 때 자신이 비슷한 위치입니다 발견했습니다. 예외 알림 개념이 좋은지 여부를 무시하면 IDictionary<string, string> 또는 NameValueCollection을 사용하는 것이 가장 좋습니다. 왜 다른 하나를 골라야합니까?

답변

1

컨텍스트가 폐기 값이고 여기에 중요한 부분이 오는 경우 직렬화되지 않습니다. 다른 시스템으로 데이터를 전송하기 때문에 IDictionary를 사용하면 인터페이스를보다 유연하게 사용할 수 있기 때문에 갈 것입니다.

반면 컨텍스트가 항상 유지되거나 컨텍스트가 직렬화되는 경우 NameValueCollection을 사용하면 호출자가 실제로 얻는 결과를 제어 할 수 있기 때문에 NameValueCollection을 사용하십시오.

mausch는 일반적인 접근 방식을 사용해야한다는 점에서 mausch가 맞지만 데이터를 직렬화하려는 경우 인터페이스를 사용하지 않습니다.

+0

"귀하가 실제로 귀하의 발신자에게서 얻을 수있는 것의 통제하에"확장 할 수 있습니까? 발신자가 중복 키를 전송할 가능성이 있습니까? 필자는 직렬화가 관련되어 있다면 사전을 피하는 이유를 잘 모르는 것 같습니다. –

+1

@JeffBridgman : 이것은 거의 10 년 전이었습니다. 실제로 의미하는 바를 기억하지 못합니다.) 특정 클래스 (예 : 직렬화 지원과 같은 특정 제약 조건)의 객체를 가져 오는 것이거나 특정 인터페이스. 예를 들어, IDictionary 구현은 직렬화 또는 일부 메소드를 지원하지 않을 수 있지만 NameValueCollection은 고정 구현이므로 컨텍스트에서 수행하려는 작업에 따라 다릅니다. 이것에 관한 몇 가지 다른 질문이 있습니다. 흥미로운 토론이 있습니다. – OregonGhost

5

(여기에 .NET 3.5을 가정. .NET 3.5을 사전, NameValueCollection은이 "정상"컬렉션없이 직접 해당 더불어, 키에 여러 값을 묶을 수 있다는 장점이 있습니다 것입니다.)

당신이 원하는 수행 키가 잠재적으로 여러 값을 가질 수 있습니까? 그렇다면 ILookup을 고려해 보겠습니다. < TKey, TValue>. 그렇지 않으면 IDictionary < TKey, TValue>를 사용합니다.

수신자가 LINQ를 사용하는 모든 처리를 수행하려는 경우 이외에 일반 인터페이스 중 하나가 NameValuePair보다 좋을 것입니다. 마찬가지로 호출자가 이미 일반 또는 동적 종류의 컨텍스트가있는 경우 LINQ를 사용하여 사전/조회를 생성하는 것이 더 쉬울 수도 있습니다.

관련 문제