我正在创建一个类库,可以在多种情况下使用,如ASP.NET、Console Apps、其他类库和XAML目标(如Silverlight或WPF)。
最初我决定将集合公开为IList。但当我编写使用XAML的示例时,我发现如果要轻松地绑定到这些集合,则需要使用ObservableCollection。
我的选择是什么?
我可以让库公开ObservableCollection并强制用户使用它,即使用户与XAML无关。这是一个坏事吗?
我可以使我的类成为通用的,允许调用者指定他们想要的集合类型,只要它实现了ICollection,可能默认为Collection。
我可以制作一组类,其中一个使用ObservableCollection,另一个不使用,称为Foo和ObservableFoo。
当我的类实现INotifyCollectionChanged时,这似乎很愚蠢,因为ObservableCollection已经为我做了这个操作。
显然,我试图保持代码简洁明了,但支持数据绑定似乎很重要。
有什么建议吗?
编辑:尝试使用两种替代方案创建可移动类库项目。
在Foo类中,我有:
在ObservableFoo类中,我有
唯一的缺点是当我使用 ReadOnlyObservableCollection 时,测试项目出现了编译错误。
引用程序集“System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes”中定义的类型“System.Collections.ObjectModel.ReadOnlyObservableCollection`1”。必须添加对该程序集的引用。
因此,在这种情况下,使用 ReadOnlyObservableCollection 将会强制用户添加对 System.Windows 的引用,这是一个缺点。
编辑:我想到了一个解决方案,发布在我的博客上 - 请参见如何使库同时具有可移植性和数据绑定友好性?。
最初我决定将集合公开为IList。但当我编写使用XAML的示例时,我发现如果要轻松地绑定到这些集合,则需要使用ObservableCollection。
我的选择是什么?
我可以让库公开ObservableCollection并强制用户使用它,即使用户与XAML无关。这是一个坏事吗?
我可以使我的类成为通用的,允许调用者指定他们想要的集合类型,只要它实现了ICollection,可能默认为Collection。
我可以制作一组类,其中一个使用ObservableCollection,另一个不使用,称为Foo和ObservableFoo。
当我的类实现INotifyCollectionChanged时,这似乎很愚蠢,因为ObservableCollection已经为我做了这个操作。
显然,我试图保持代码简洁明了,但支持数据绑定似乎很重要。
有什么建议吗?
编辑:尝试使用两种替代方案创建可移动类库项目。
在Foo类中,我有:
private readonly Collection<string> strings = new Collection<string>();
public ReadOnlyCollection<string> Strings
{
get
{
return new ReadOnlyCollection<string>(this.strings);
}
}
在ObservableFoo类中,我有
private readonly ObservableCollection<string> strings = new ObservableCollection<string>();
public ReadOnlyObservableCollection<string> Strings
{
get
{
return new ReadOnlyObservableCollection<string>(this.strings);
}
}
这个非常简单的单元测试代码是
[TestMethod]
public void TestMethod1()
{
var foo = new ObservableFoo(); // or new Foo()
Assert.AreNotEqual(0, foo.Id);
Assert.AreNotEqual(0, foo.Strings.Count);
}
唯一的缺点是当我使用 ReadOnlyObservableCollection 时,测试项目出现了编译错误。
引用程序集“System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes”中定义的类型“System.Collections.ObjectModel.ReadOnlyObservableCollection`1”。必须添加对该程序集的引用。
因此,在这种情况下,使用 ReadOnlyObservableCollection 将会强制用户添加对 System.Windows 的引用,这是一个缺点。
编辑:我想到了一个解决方案,发布在我的博客上 - 请参见如何使库同时具有可移植性和数据绑定友好性?。