次の例を検討してください。
データベース (Stackoverflow に似ています) には、同じテーブル内に質問と回答をPostType
フィールドで区別できるテーブルがあります。質問でも回答でも、最新の投稿のリストを取得したいと思います。
質問と回答は共通のプロパティを共有するため、両方のクラスが抽象クラスを継承しContentBase
ます。各タイプに関連するフィールドをいくつか追加するだけです。
IList<ContentBase>
個々のアイテムが具体的なタイプであるQuestion
かAnswer
、基準フィールドに基づいている場合に、キャスト先のコンテンツ アイテムのリストを取得するにはどうすればよいですか。
public abstract class ContentBase
{
public int Id { get; set; }
public string Title { get; set; }
public User Author { get; set; }
public abstract ContentType Type { get; }
...
}
public class Question : ContentBase
{
public override ContentType Type
{
get { return ContentType.Question; }
}
...
}
public class Answer: ContentBase
{
public override ContentType Type
{
get { return ContentType.Answer; }
}
...
}
私のリポジトリには次の呼び出しがあります。
IList<ContentBase> result = db.GetLatest();
私は PetaPoco/NPoco を使用していますが、Dapper を使用した場合も同じ問題が発生すると思います。
質問
ContentType
特定のフィールドの値 (この場合) に基づいて正しい具象型をインスタンス化するように DAL に指示するにはどうすればよいですか?
説明
私はこれらの行に沿って何かをする必要があります:
db.Fetch<ContentBase, User>(...)
しかしContentBase
、抽象クラスなのでできません。この行を次のように変更すると:
db.Fetch<dynamic, User>(...)
InvalidOperationException
NPoco からCan't auto join Userというメッセージが表示されるため、まだ機能しません。
これを行う唯一の方法は、継承された新しいクラスを作成し、デリゲートPocoData
の独自の実装を提供することだと思います。おもう。具体的な POCO がインスタンス化される拡張ポイントは他にないと思います。抽象祖先クラスを処理しているため、この方法で行うべきかどうか、どのように行うべきかわかりません。GetFactory