私は3 dll(web.dll、businesslogic.dll、services.dll)のアプリを持っています。 Webアプリケーションは、サービスを使用するビジネスロジックオブジェクトをインスタンス化します。すべてのサービスはインターフェースの背後に隠されており、私はautofacを使ってビジネスロジックオブジェクトに実装を挿入します。ここには何もない。依存性注入:実装を完全に非表示にして、コンテナに依存するか、実装とコンストラクタを公開しますか?
私のサービスのインターフェイスを公開にして、自分のアプリケーションの内部構造を作ることで自分のアプリケーションの実装を隠すことで、アプリケーションのカプセル化を改善しようとしています。 Autofacの自動登録では、コンストラクタに接続文字列のような値型のパラメータがなければ正常に機能します。私はので、私は1が最高とみなされるであろうと思いまして、それぞれに長所と短所と3つの選択肢を持っています。素晴らしい作品が、多くのを作成する、:(IMyServiceConfigurations EX)
は、インターフェイスにすべての私の値のパラメータを交換してください1つのプロパティーインターフェースと、コンストラクターを少し難読化した実装
登録をautofacモジュールに入れてサービスDLLに入れます。そうすることで、私は本当に好きではないサービスdllのAutofacに依存します。私は、アプリケーションのルート(Webアプリケーション)がコンテナに依存することを好むだけです。
NamedParameterまたはTypedParameterを使用しますが、アプリケーションのルートは使用されるコンストラクタを知る必要があります。実装)、カプセル化が別の方法で壊れてしまいます。
サービスDLL以外の実装を漏らさずに達成する方法についてのアイデアやコメントがあります。
ありがとうございました。
そのような場合のトリックは、実際のインスタンスの代わりにファクトリを挿入することです。例えば、リポジトリパターンでは、 'IRepository'の代わりに' IRepositoryFactory'を注入します。そしてあなたの工場は、 'IRepository'を返す' Create(string connectionString) 'メソッドを定義します。あなたの工場はリポジトリの実装について知っているので、コンストラクタを直接呼び出すことができます –
わかりません。そうすることで、構成をビジネスロジック層に知らせる必要が生じます。実装の詳細を別のレイヤーに漏らすことによって、実際には最悪のことになると私は思う。提案をありがとうが、私はそれが私の問題を解決するとは思わない。 –
@KooKiz:工場の抽象化は、(決して)(https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)正しい解決策です。 – Steven