2016-10-29 12 views
2

私は3 dll(web.dll、businesslogic.dll、services.dll)のアプリを持っています。 Webアプリケーションは、サービスを使用するビジネスロジックオブジェクトをインスタンス化します。すべてのサービスはインターフェースの背後に隠されており、私はautofacを使ってビジネスロジックオブジェクトに実装を挿入します。ここには何もない。依存性注入:実装を完全に非表示にして、コンテナに依存するか、実装とコンストラクタを公開しますか?

私のサービスのインターフェイスを公開にして、自分のアプリケーションの内部構造を作ることで自分のアプリケーションの実装を隠すことで、アプリケーションのカプセル化を改善しようとしています。 Autofacの自動登録では、コンストラクタに接続文字列のような値型のパラメータがなければ正常に機能します。私はので、私は1が最高とみなされるであろうと思いまして、それぞれに長所と短所と3つの選択肢を持っています。素晴らしい作品が、多くのを作成する、:(IMyServiceConfigurations EX)

  1. は、インターフェイスにすべての私の値のパラメータを交換してください1つのプロパティーインターフェースと、コンストラクターを少し難読化した実装

  2. 登録をautofacモジュールに入れてサービスDLLに入れます。そうすることで、私は本当に好きではないサービスdllのAutofacに依存します。私は、アプリケーションのルート(Webアプリケーション)がコンテナに依存することを好むだけです。

  3. NamedParameterまたはTypedParameterを使用しますが、アプリケーションのルートは使用されるコンストラクタを知る必要があります。実装)、カプセル化が別の方法で壊れてしまいます。

サービスDLL以外の実装を漏らさずに達成する方法についてのアイデアやコメントがあります。

ありがとうございました。

+0

そのような場合のトリックは、実際のインスタンスの代わりにファクトリを挿入することです。例えば、リポジトリパターンでは、 'IRepository'の代わりに' IRepositoryFactory'を注入します。そしてあなたの工場は、 'IRepository'を返す' Create(string connectionString) 'メソッドを定義します。あなたの工場はリポジトリの実装について知っているので、コンストラクタを直接呼び出すことができます –

+2

わかりません。そうすることで、構成をビジネスロジック層に知らせる必要が生じます。実装の詳細を別のレイヤーに漏らすことによって、実際には最悪のことになると私は思う。提案をありがとうが、私はそれが私の問題を解決するとは思わない。 –

+0

@KooKiz:工場の抽象化は、(決して)(https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)正しい解決策です。 – Steven

答えて

1

私は私のサービスのインタフェースは、公開することによって、私のアプリのためのより良いカプセル化を作成しようとしていますが、クラスが内部作り、それらを内部

を行うことで、私のタイプの実装を隠蔽することは変更されません。カプセル化を考慮したものあなたのコンポーネントは抽象化に依存しているので、消費者の視点からカプセル化に違いはありません。彼らはまだ実装の存在を知らない。これは、コンシューマが依存関係のない別のアセンブリに実装を移すと、誇張される可能性があります。このようにして、実装は消費者が直接使用することなく公開することができます。

これ以外にも、実装が公開されている場合でも、実装されているインターフェイスによって公開されている部分を除いてすべてを内部的にすることで、通常はその不変条件を保護します。つまり、公開されていてもカプセル化が適用されています。

ビジネスアプリケーションのアプリケーションでは、通常、実装を内部で行うことで何も得られません。あなたのアプリケーションの外の誰もこれらのタイプを使用しようとはしません。これらの実装には2人の消費者がいる。それらの消費者はユニットテストであり、アプリケーションのcomposition rootです。両方のために、あなたがそれらを内部にする場合、それはあなたの仕事をより困難にするだけです。

これらのタイプを公開することを再検討します。

+0

私が持っている目標は、インプリメンテーションを内部的にすることによって、デベロッパーが簡単にインスタンス化できるので、インターフェイスではなくインプリメンテーションを使用しないと確信しています。インターフェイスがどこでも使用されている場合は同じことですが、私が防止したい動作を難しく(または不可能に)することで、それらが成功のピットに落ちるようにしたいと私は同意します。私は単体テスト難易度を知っていますが、これはテストプロジェクト(そしてこれだけ)が内部型を見ることを可能にすることでより簡単にすることができます。 –

+0

もちろん、私はコードレビューのような他の技術でこの問題を解決することができますが、これをコンパイラレベルで回避する方法を見つけるのは興味深いです。ありがとう。 –

+2

@ mberube.netあなたはソリッドの原理を使ってこれを解決する必要があります。 Dependency Inversion Principleを見ると、上位層が抽象を定義する必要があることが示されています。したがって、依存関係を逆転させる必要があります。インタフェースをコンシューマと同じアセンブリに配置し、実装をコンシューマアセンブリに依存させるようにします。 – Steven

関連する問題