2010-07-20 3 views
1

이전 버전의 프레임 워크를 지원해야하는 라이브러리에 .NET 4.0 인터페이스 인 IObserver를 사용하고 싶습니다. 이미 프레임 워크 버전마다 빌드 할 수있는 조건부 컴파일이 있습니다.System.IObserver 용 .NET 3.5 스탠드

Rx 확장 프로그램의 버전을 IObserver<T>으로 사용하지 않으려면 독립 실행 형 어셈블리에 불필요한 종속성을 추가 할 수 있습니다.

은 내가 내 도서관과 여러분 모두 내 질문에 코드 블록을 추가하는 것을 고려하고있어 이것이다 :

1) 나는이 나쁜 생각을 알고,하지만 난 그림을 시도하고있다 정확히 "왜?"

#if !NET40 
namespace System 
{ 
    public interface IObserver<in T> 
    { 
     void OnCompleted(); 
     void OnError(Exception error); 
     void OnNext(T value); 
    } 
} 
#endif 

는 그 .NET 4.0 사용자는 내가 아직 생각하지 않은 멋진 방법으로 통합 할 수 있도록 표준 인터페이스를 사용하고 싶습니다. 그래서 나는 개념을 복제하고 다른 위로 올라오고 오는 IObservable<T>와의 통합을 느슨하게하고 싶지 않습니다.

내 위험성은 .NET 4.0에서 .NET 3.5 빌드가 .NET 4.0에서 사용되면 유형 충돌이 발생할 수 있다는 것입니다. 이상적으로는 v4.0을 사용하는 사람이 4.0 빌드를 사용합니다.

이 접근법에 대해 알아야 할 다른 사항이 있습니까?

#if !NET40 
namespace Foo 
{ 
    public interface IObserverProxy<in T> 
    { 
     void OnCompleted(); 
     void OnError(Exception error); 
     void OnNext(T value); 
    } 
} 
#endif 
:

2) 또는, 나는 내가 기울고 있어요)이 나쁜 생각하는 이유에 대한 사람들의 생각을 알고 싶습니다 방향 인 (대신 내 코드에서이 일을 생각했습니다

그리고 나중에 내가 그것을 사용하고자하는 경우 :

#if NET40 
using IObserverBar=System.IObserver<Bar>; 
#else 
using IObserverBar=Foo.IObserverProxy<Bar>; 
#endif 

어떤 생각이?

답변

3

extern aliasing과 함께 C# 확장 메서드가 잘 작동하지 않기 때문에 System 네임 스페이스에 인터페이스를 두지 말 것을 권합니다. Rx와 라이브러리를 모두 사용하는 사람들이 깨지기 때문에 인터페이스를 넣을 것입니다. Foo 네임 스페이스. 바로 이런 이유로 별도의 dll을 System.Observable.dll로 이동되었습니다

static System.IObservable<T> ToSystemObservable<T>(this Foo.IObservable<T> source) 
또한

수신에서 관찰 인터페이스 :뿐만 아니라 라이브러리 및 Rx를 사용하고자하는 사람들은 항상이 같은 확장 방법을 구축 할 수 있습니다 , 나는 그것들을 사용하여 재검토하도록 강력히 권합니다. 이 DLL은 Rx 빌드에서 Rx 빌드로 버전을 바꾸지 않으므로 버전 문제가 없어야합니다. 이 방법으로 라이브러리를 사용하는 사람은 관찰 가능한 객체에 대해 쿼리를 수행하려는 Rx의 모든 (최근) 빌드를 사용할 수 있습니다.

+0

이들은 좋은 점입니다. 확실히 System' 네임 스페이스에 넣지는 않을 것이지만 만약 내가했다면 무엇이 망가질 지 궁금하다. 내 라이브러리의 핵심 개념이 아니기 때문에 외부 DLL을 포함시키지 않는 편이 좋을 지 모르지만, 필자가 그 측면을 고립 시켰음을 알면 좋다. 감사! – mckamey