DDD の誇大宣伝に触発されて、データベースがまったくないふりをしてクラスを設計しました。次に、NHibernate を使用して、クラスをデータベース テーブルにマップしました。クラス グラフの一部は次のようになります。注文 (hasmany)--> 製品 (belongsto)--> 販売者 特定の販売者に発注されたすべての注文を取得します。私はコードを持っています:
public class Order:ActiveRecordBase<Order>
{
[HasMany]
public ICollection<Product> Items{get;set;}
...
}
public class Product: Order:ActiveRecordBase<Product>
{
[BelongsTo]
public Seller Seller{get; set;}
...
}
public class OrderRepository:IOrderRepository
{
public IQuerable<Order> GetOrdersBySellerId(int sellerId)
{
return Order.FindAll().AsQuerable.Where(x=>x.Items.Count > 0 &&
x.Items.First().Seller.SellerID == sellerId).AsQuerable();
}
}
きれいではありませんが、単体テストでは機能しました。実際のデータをデータベースに注入し始めるまで、私は幸せでした。吐きたいほどの出来の悪さ。そこで、リポジトリ コードについて少し調査を行いました。当然のことながら、必要な注文を見つけるには、Order テーブルからすべてのデータを取得し、Product テーブルからすべてのデータを取得し、Seller テーブルから一部のデータを取得する必要がありました。
だから、ここに私の問題があります。データベース領域の完全なダミーとして、リポジトリ コードがひどく臭いことはわかっていても、リポジトリ コードを改善する方法がわかりません。そのため、Order クラスを変更して Seller クラスへの参照を持たせ、hql を使用して Where 句を追加し、パフォーマンスを向上させたいと考えています。しかし、データベースの問題によるクラス構造の変更は、DDD の原則に違反しているようです。
特に私のリポジトリコードを改善する上で、あなたの提案は何ですか? ActiveRecord と hql に Linq を試しました。しかし、それらを機能させることができませんでした。