3

次のプロジェクトを持つソリューションがあります。

  • コア (ビジネス オブジェクト/ドメインに関連しない、処理用のクラスを含む)
  • ドメイン (ビジネス オブジェクトを含む)
  • ハーネス(コンソールアプリ)
  • MVC4 アプリ
  • 永続性 (リポジトリ インターフェイス、EF マッピングなどの実装を含む)
  • リポジトリ (リポジトリ インターフェイスを含む)
  • テスト (単体テストを含む)

NInject を使用した経験があるため、IoC コンテナーとして使用したいと考えていますが、自分のニーズにより適したものを提案することは自由です。

ドメイン オブジェクトは、データ アクセスを行うために、リポジトリについて知る必要があります (つまり、Person クラスはすべての AddressDetails を取得する必要がある場合があります)。単体テストでのモックに役立つように、すべてがインターフェースにコーディングされています。

ドメイン プロジェクトが IoC コンテナーに依存することは望ましくありませんが、ドメイン プロジェクトですべてのインスタンスを作成し、適切なリポジトリを挿入する方法が必要です。これどうやってするの?また、必要に応じてハーネスとテスト プロジェクトからインジェクションを実行できるようにしたいと考えています。これを行う唯一の方法は、NInject から StandardKernel をラップする Domain クラスに静的オブジェクトを配置し、それを呼び出して依存関係を設定することです。その方法を使用するとは思わないコンストラクターインジェクションを機能させることができれば、それもいいでしょう。私が考えることができるもう1つの選択肢は、正しい依存関係を持つドメインオブジェクトを構築するファクトリを持つことですが、毎回ファクトリを呼び出さなければならないのではなく、 IPerson person = new Person() を持つことができます。

前もって感謝します。

4

2 に答える 2

3

ドメイン オブジェクトは、データ アクセスを行うために、リポジトリについて知る必要があります (つまり、Person クラスはすべての AddressDetails を取得する必要がある場合があります)。単体テストでのモックに役立つように、すべてがインターフェースにコーディングされています。

ドメイン オブジェクトはメモリ内オブジェクトで永続的な無知であるため、リポジトリを認識する必要はありません。ORM を使用する場合、AddressDetails は遅延読み込みにするか、Person エンティティの外部に割り当てる必要があります。

したがって、この方法では、ドメインエンティティを IoC コンテナーに入れる必要はありません。IoC コンテナーを使いすぎないように注意してください。どの型を入れるべきかを考えてください。全てをIoC Containerに入れると、ぐちゃぐちゃなタイプのプールになってしまいます。

IoC に配置する必要がある適切なクラスは、各レイヤーのメイン クラスです。例:

  1. サービス。
  2. リポジトリ。
  3. ORM。
  4. コントローラー。
  5. 分野横断的な関心事: ログ、キャッシュ...

他のインメモリ クラスは配置しないでください。

于 2012-08-25T08:25:03.410 に答える
1

MVC4 プロジェクトとコンソール アプリケーションにコンポジション ルートを導入する必要があるようです。したがって、すべての依存関係は、本番コード全体に対してのみ結合されます。また、 の独自の実装を定義しStandardKernelたり、自動検出を使用してすべての実装を検索したりすることもできます。

composition root オーバーロードStandartKernel自動検出を実装する方法の例が 2 つあります。これはninject.web.mvc出発点として役立ちます。Composition rootコンソールアプリケーションの場合、通常、簡単な実装があります。

テスト プロジェクトではninject.mockingkernel、適切なモック ライブラリを使用するか、すべての依存関係を自分で構築できます。2 番目のオプションは純粋な単体テストでは明らかですが、統合テストでは最初のオプションの方が適切です。

ドメイン オブジェクトの注入

  • まず、よく知られている注入方法がいくつかあります。

    • コンストラクタを介して、
    • 財産、
    • 方法
    • 環境。

    たとえば、そのオブジェクトに必要なすべての依存関係を定義する、ドメイン オブジェクトの既定ではないコンストラクターを 1 つだけ実装します。リポジトリに依存する場合は、ドメイン オブジェクトのコンストラクターでこれを指定します。これを指定せずにこの特定のドメイン オブジェクトを作成する方法は他にありません。

  • 第二に、そうすることで、依存性注入ライブラリへの依存を避けることができます
于 2012-08-25T09:25:50.947 に答える