1

我想将 .NET 4.0 接口 IObserver 用于需要支持以前版本的框架的库。我已经有了条件编译,可以让我为每个框架版本进行构建。

我不想使用 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

有什么想法吗?

4

1 回答 1

3

由于 C# 扩展方法不能很好地与外部别名一起使用,我建议您不要将接口放在 System 命名空间中,因为它会破坏同时使用 Rx 和您的库的人,我会将接口放在 Foo 命名空间中。想要使用你的库和 Rx 的人总是可以像这样构建一个扩展方法:

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

此外,出于这个原因,Rx 中的 Observable 接口已移至单独的 dll System.Observable.dll,我强烈建议您重新考虑使用这些接口。此 dll 不会从 Rx 构建版本到 Rx 构建版本,因此不应该有版本问题。这样,任何使用您的库的人都可以使用他们想要对您的可观察对象进行查询的任何(最近的)Rx 构建。

于 2010-07-21T23:49:23.890 回答