RavenDB に格納されている次の (単純化された) ドメイン モデルを検討してください。
public abstract class PriceCalculation
{
// omitted for brevity
}
public class CostBasedPriceCalculation : PriceCalculation
{
public decimal Margin { get; private set; }
}
public class FixedPriceCalculation : PriceCalculation
{
public decimal FixedPrice { get; private set; }
}
public class ProductPricingStrategy
{
public string ProductId { get; private set; }
public PriceCalculation PriceCalculation { get; private set; }
}
格納されたエンティティはProductPricingStrategy
、価格計算タイプと価格計算固有の変数でコレクションを照会できるようにしたいと考えています。たとえば、マージンが 0.2 未満のコストベースの価格計算を持つすべての製品価格設定戦略のセットを取得したいと考えています。つまり、次の射影を照会できるようにしたいと考えています。
public class FlattenedProductPricingStrategy
{
public string PriceCalculationType { get; set; }
public decimal? FixedPrice { get; set; }
public decimal? Margin { get; set; }
}
力ずくのアプローチは、ドメイン オブジェクト モデルを直接格納するのではなく、プロジェクションにより厳密に一致する平坦化されたクラス階層を格納することです。RavenDB から取得して永続化すると、フラット化されたオブジェクトがドメイン オブジェクトにマップされます。マップされたクラスですべてのシリアライゼーションの問題を処理できることや、リファクタリング用のバッファー ゾーンを持つことなど、他の理由で中間オブジェクトを使用することを検討しましたが、それから遠ざかりました。この中間オブジェクトを回避し、元のオブジェクト モデルに基づいて直接インデックスを作成する方法はありますか?