3

こんにちは、建物のドメインのコレクションを返そうとしています。

private long _id;
private string _buildingName;
private IList<BasicRoom> _rooms;

私はNHibernateを使用しており、部屋にはこのマッピングを使用しています

<bag name="rooms" table="tb_rooms" lazy="false">
<key column="buildingID"/>
<one-to-many class="Room"/>
</bag>

そして、私はこのようにデータベースを呼び出しています。

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>();

問題は、_rooms コレクションを IList にしたくないのですが、List にする必要があることです。残念ながら、NHibernate では、コレクションに Interface を使用する必要があります。これを行う方法はありますか。私は .Net に不慣れで、おそらく NHibernate を削除することが今後の道かもしれないと考えています。次に進むことができるように、リストとして型指定されたコレクションを取得する必要があります。どんな助けでも大歓迎です。

4

3 に答える 3

12

それはNHibernateの仕組みではありません。ドメイン モデル オブジェクトの具象型が何であるかを伝えることはできません。基本型とインターフェースが何であるかを伝えるだけです。次に、ドメイン タイプを効率的に実装する方法を選択します。

たとえば、NHibernate は、IList<T>遅延読み込みを行う方法を知っている独自の内部実装を使用します。

Buildingさらに、NHibernate はドメイン モデルからの独自の内部実装を使用します。BuildingNHibernate で使用するすべてのオブジェクトが具体的な型としてBuilding. がオブジェクトの具象型であるか、オブジェクトの具象型の基本型であるかに関係なく、それらがBuildings になることだけは真実です。Building

ただし、具体的な型の代わりにインターフェイスと基本型を使用することになっているため、これは正しいことです。NHibernate は、プログラミングに対するすべての適切なアプローチを使用するのに役立ちます。

では、なぜList<Building>それ自体が必要なのでしょうか? なぜIList<Building>十分ではないのですか?

于 2009-02-01T22:32:43.580 に答える
5

Listでやりたいことは何でもできるのに、なぜ具体的なオブジェクトが必要なのIListですか?

絶対に具体的なリストでなければならない場合は、2 つのオプションがあります。

まず、単純に to をキャストIList<Building>List<Building>ます。これは、基になる型aList<Building>である場合にのみ機能しますが、これは個人的には疑問です。

次に、ToList() 拡張メソッドを呼び出します。

Buildings = (List<Building>)session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>().ToList();

個人的には、どちらも行わず、代わりに IList を使用することをお勧めします。

于 2009-01-30T03:01:30.590 に答える
2

のコンストラクターを使用するのはどうList<T>ですかIEnumerable<T>? 次に、次を使用できます。

Buildings = new List<Building>(session.CreateCriteria(typeof(Building)).AddOrder(Order.Asc("buildingName")).List<Building>());
于 2009-02-01T22:23:37.327 に答える