0

単独で使用したり、集合体に結合したりできるドメインエンティティのロードを実現するために必要なインターフェイスと抽象を設計しようとすると、完全に混乱しました。わお。それは一口の流行語でした。基本的に、基本タイプの「ロード」機能が必要な2つのオブジェクトがありますが、これら2つのオブジェクトを1つに組み合わせると、多重継承に遭遇します。

だから、私はこのような私のエンティティを持っています(私は描くでしょう

public class Account
public class Document
public class AccountDocument
{
    public Account Account{get;set;}
    public Document Document{get;set;}
}

次に、次のようなインターフェイスがあります。

public interface IAccountRepository
{
    Account Load(IDataContext context);
}

public interface IDocumentRepository
{
    Document Load(IDataContext context);
}

public interface IAccountDocumentRepository
{
    AccountDocument Load(IDataContext context);
}

アカウントとドキュメントの両方が他のエンティティから派生する可能性がある(そして派生している)ので、DRYに従うように、実装に基本機能を提供したいと思います。

public abstract class AccountRepositoryBase : IAccountRepository
{
    Account Load(IDataContext context)
    {
        //implementation for loading the Account from the context
    }
}

public abstract class DocumentRepositoryBase : IDocumentRepository
{
    Document Load(IDataContext context)
    {
        //implementation for loading the Document from the context
    }
}

これは、個々のAccountオブジェクトとDocumentオブジェクト、およびそれらの派生に対しては正常に機能しますが、頭を悩ませることができない問題は、AccountDocumentの処理方法です...

public class AccountDocumentRepository : AccountRepositoryBase, DocumentRepositoryBase
{
    //This is not possible, of course, due to multiple inheritance.
}

解決策はそれほど難しいものではないことはわかっていますが、私は完全に絡み合っており、基本の「ロード」機能を1回だけ提供する方法を明確にすることはできません。助けてください!

前もって感謝します。

4

3 に答える 3

2

これは、実装の継承の代わりに構成を使用することで解決できAccountDocumentRepositoryます。すでに作成したリポジトリクラスに委任するだけです。

public class AccountDocumentRepository : IAccountDocumentRepository
{
    IAccountRepository accountRepository = new AccountRepositoryBase();
    IDocumentRepository documentRepository  = new DocumentRepositoryBase();

    public AccountDocument Load(IDataContext context) {
        Document document = this.documentRepository.Load(context);
        Account  account  = this.accountRepository.Load(context);
        return new AccountDocument(account, document);
    }
}

IAccountRepositoryさまざまな具象リポジトリを柔軟に置き換える必要がある場合は、クライアントコードがとを挿入できるようにするコンストラクタまたはプロパティを提供できますIDocumentRepository

実装の継承と構成の相対的なメリットについて説明し、構成を強く優先する理由を説明するStackOverflowに関する優れた質問がいくつかあります。これらは、「構成の継承」を検索した結果のほんの一部です。

于 2009-09-29T16:23:25.653 に答える
1

AccountDocumentRepositoryを実装してIAccountDocumentRepository、から継承しAccountRepositoryBaseたくないですDocumentRepositoryBaseか?

次に、いつでもインターフェイスAccountRepositoryBaseDocumentRepositoryBaseプロパティをIAccountDocumentRepository追加するか、のコンストラクターにプロパティを追加してAccountDocumentRepository、両方のインスタンスで作業を実行できるようにすることができます。

public class AccountDocumentRepository : IAccountDocumentRepository
{
    public AccountDocumentRepository(AccountRepositoryBase account, DocumentRepositoryBase document)
    {
        this.account = account;
        this.document = document;
    }

    public AccountDocument Load(IDataContext context)
    {
        //use your account & document instances here to create an AccountDocument.
    }

}
于 2009-09-29T16:23:11.113 に答える
0

『 Patterns Of Enterprise Application Architecture』の本から、継承マッパーパターンを調べることをお勧めします。

次に、それに基づいて独自の種類の継承リポジトリパターンを作成します。

見る:

  • 単一テーブル継承(278)、
  • クラステーブル継承(285)、
  • 具体的なテーブル継承(293)、
  • 継承マッパー(302)。

http://martinfowler.com/eaaCatalog/

于 2010-01-24T08:38:38.670 に答える