.NET 2.0以前のCSLAでモデル化されたビジネスオブジェクトを使用しているクライアント向けに、大規模なWinformsプロジェクトに取り組んでいます。新しいバージョンのCSLAにアップグレードすることはできません。私のクライアントはCodeSmithを使用して、データベーステーブルから「ベース」のCSLAスタイルのビジネスオブジェクトを生成します。すべてのビジネスオブジェクトには、対応する「リスト」クラスが付属しています。
生成されたListクラスはを実装していないため、私が遭遇した問題の1つはWinformsコントロールへのバインドITypedList
です。クライアントから、Listクラスを拡張して自分で実装できると言われましたが(以下のコードスニペットが提供されています)、かなりの数のビジネスオブジェクトを処理しており、リストの1つを拡張するたびにDRYに違反しています。実装するクラスITypedList
。私はすべての拡張リストクラスで次のコードを使用しています。
public class SomeItemListExtended : SomeItemListBase, ITypedList
{
public string GetListName(PropertyDescriptor[] listAccessors)
{
return null;
}
public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] listAccessors)
{
return TypeDescriptor.GetProperties(CreateContent().GetType());
}
}
CreateContent
リストがコレクションであるアイテムの新しいインスタンスを返すだけです。
public BusinessBase CreateContent()
{
return new SomeItem();
}
私は、継承を使用して各リストクラス拡張で同じコードが重複しないようにする方法があるかどうかを理解しようとしていますが、多重継承なしでそれを行う方法を理解していません。とにかく可能です。ListExtensionBase
を実装するクラスを作成した場合ITypedList
、拡張クラスは両方から継承できずListExtensionBase
、上記の例ではSomeItemListBase
。ジェネリックパラメーターを使用して基本クラスを作成すると、すべての基本クラスメンバーに直接アクセスできなくなります。私SomeItemListBase
は生成方法を制御できず、ビジネスオブジェクトフレームワークをそのまま使用するように指示されています。ITypedList
すべてのリスト拡張機能に同じコードを使用して実装する方法はありますか?実装ごとに同じコードを使用する必要がありますか、それともITypedList
実装は拡張機能ごとに異なりますか?