ASP.NET、コンソール アプリ、その他のクラス ライブラリ、Silverlight や WPF などの XAML ターゲットなど、さまざまな状況で使用できるクラス ライブラリを作成しています。
最初に、コレクションを IList として公開することにしました。しかし、XAML を使用してサンプルを作成しているときに、これらのコレクションへのバインドを簡単にしたい場合は、ObservableCollection を使用する必要があることがわかりました。
私のオプションは何ですか?
ライブラリで ObservableCollection を公開し、XAML とは関係のないユーザーにそれを強制することができます。それは悪いことですか?
クラスをジェネリックにして、呼び出し元が ICollection を実装している限り、必要なコレクションの型を指定できるようにすることができます。
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.Collections.ObjectModel.ReadOnlyObservableCollection`1' は、参照されていないアセンブリで定義されています。アセンブリ 'System.Windows、Version=2.0.5.0、Culture=neutral、PublicKeyToken=7cec85d7bea7798e、Retargetable=Yes' への参照を追加する必要があります。
したがって、この場合、ReadOnlyObservableCollection を使用すると、ユーザーは System.Windows への参照を追加する必要があり、これは欠点です。
編集:ブログに投稿した解決策を思いつきました-ライブラリを移植可能にし、同時にデータバインディングを使いやすくする方法を参照してください。