.NET 3.5 stand-in для System.IObserver <T> - PullRequest
1 голос
/ 20 июля 2010

Я хочу использовать IObserver с интерфейсом .NET 4.0 для библиотеки, которая также должна поддерживать предыдущие версии платформы. У меня уже есть условная компиляция, которая позволяет мне строить для каждой версии фреймворка.

Я не хочу использовать версию Rx Extensions 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 3.5 моей библиотеки в .NET 4.0 могут возникнуть коллизии типов. В идеале, однако, кто-то, использующий v4.0, мог бы использовать библиотеку 4.0 для сборки.

Есть ли еще какие-то вещи, о которых мне следует знать при таком подходе?

2) В качестве альтернативы , я решил вместо этого сделать это в своем коде (в этом направлении я склоняюсь) и хотел бы узнать мысли людей о том, почему это плохая идея:

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

И позже, где я хочу его использовать:

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

Есть мысли?

1 Ответ

3 голосов
/ 22 июля 2010

Поскольку методы расширения C # не очень хорошо работают вместе с внешним псевдонимом, я бы посоветовал вам не помещать интерфейс в пространство имен System, так как это сломает людей, которые используют Rx и вашу библиотеку, я бы поместил интерфейс в Foo namespace. Люди, которые также хотят использовать вашу библиотеку и Rx, всегда могут создать метод расширения, подобный этому:

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

Также наблюдаемые интерфейсы в Rx были перемещены в отдельную dll System.Observable.dll именно по этой причине, я настоятельно рекомендую вам пересмотреть их использование. Эта dll не поддерживает версию из сборки Rx в сборку Rx, поэтому не должно иметь проблем с версиями. Таким образом, любой, кто использует вашу библиотеку, может использовать любую (недавнюю) сборку Rx, которую он хочет делать по вашим наблюдаемым объектам.

...