web-dev-qa-db-ja.com

DIベースのソフトウェアの3層アーキテクチャ

Dependency InjectionがAsp.netコアに組み込まれていることを知っているように、私は3層アーキテクチャとasp.netコアでソフトウェアを構築しています。

私が知っているように、3層アーキテクチャ図は次のようです: enter image description here

上記の図によると、データアクセス層とUI層の間にdirect接続がありません

私のプロジェクトは:

enter image description here

私の質問は、UIとDalの間に直接接続がない場合、DALをサービスとしてUIレイヤーに登録するにはどうすればよいですか?

2
Mohammad Ansari

アプリケーション(UIプロジェクト)のエントリポイントは、DIコンテナーをセットアップして、すべての依存関係の実装を提供する必要があります。そのため、他のすべてのプロジェクトに直接接続(参照)する必要があります。

重要なのは、UIクラスがBLLクラスにのみ依存していることです。追加のリファレンスは、DIのセットアップのみを目的としています。

4
Rumen Georgiev

最初のポイント-簡単にするために、ルーメンの答えは正しいです。

より大きなソリューションで私がしていることは、依存関係注入コンテナーをセットアップする別個のインフラストラクチャプロジェクトを作成することです(.netコアでは、これはIServiceCollectionです)。

たとえば、私の現在のソリューションでは、ウェブサイトとAPIの両方を持っています。これらの両方は、依存関係注入をセットアップするために、インフラストラクチャプロジェクトでメソッドを呼び出します。次に、UIプロジェクトで、コードを知らなくても、セットアップする依存関係を決定できます。例えば.

  • テストには、「AddMockRepositories」という拡張メソッドを使用できます。 「_serviceCollection.AddMockRepositories()」
  • 開発には、「AddRepositories(connectionString)
  • 本番環境では、「AddCachedRepositories(connectionString、objectCache)を使用できます。

このアプローチには2つの利点があります。

  1. すべてのDIコードは1つのプロジェクトにあります。コードを複製することなく、他のプロジェクト間でこれを共有できます。これには、非常に便利なキャッシングコードを共有できることが含まれます。
  2. UIプロジェクトはDALを参照する必要はありません。これは、誤って、または誤って、UIプロジェクトからDALを直接参照することはできないことを意味します。

余談ですが、これが他のDIフレームワークにどれだけうまく翻訳できるかはわかりません。私はそれらすべてが同様に依存関係を設定することを想像しますが、ネイティブ.netコア依存関係注入を使用して上記を実行しただけです。

2
Jack