2012-03-12 3 views
0

シングルトンBはシングルトンを初期化しますA.シングルトンAはBを認識しません。どのようにAを使用して、Bが初期化ルーチンを最初に実行したことを確認できますか?異なるアセンブリ内のシングルトン間の依存性

BとAは異なるアセンブリにあり、異なるチームによってメンテナンスされています。

実装を完全に分離して維持しようとしています。


ベストアンサーはちょうどそうではないようです。ここで考えていることは次のとおりです。

は、特定のインターフェイスを実装する登録クラスを使用して初期化を開始します。 DoSomethingが呼び出され、Tがこれまでに見たことのないアセンブリに含まれる場合、指定されたIRegistrationインターフェイスを持つクラスを検索します。

だから...それは依存関係を取り除くでしょう。それは反射を使うだろう。メソッドが呼び出されるたびにタイプアセンブリの家を調べなければならないかもしれませんが、あまりにも高い価格で支払うことはありません

+15

恩赦私の... *** AAAAAAAAAAAAAAAAAAAAAAAAAAH !!! *** –

+2

私は、これはあなたがここに持っている良いデザインであることを信じることができない... –

+5

ああ...シングルトンは最悪ですそれ以来、アプリケーション設計に起こったことは...彼らが最悪である可能性があります。私はこの回答を投稿しませんが、あなたはDI/IoCでアプリケーションを再構築しようとするべきです。そうすれば、あなたはそれをきれいに管理し、テストを簡単にすることができます。 – Alex

答えて

1

への依存がかかるため、あなたの質問は意味結合のレベル、シングルトンではないそれらの両方をリファクタリングし、コンストラクタ・インジェクション経由で参照B渡す検討しますあなたのデザインの質に関して私を深刻な疑問にさらします。

  1. あなたの問題に対する答えは、ほぼ確実にシングルトンではありません。彼らはかなり珍しいはずです。
  2. AがBを認識していない場合、Bの後にAを初期化する必要はありません。むしろ、BはAが最初に初期化されたかBの初期化中であってもAを使用できるはずです。
  3. これを行う必要がある場合は、遅延インスタンス化を使用しないでください。静的コンストラクタで初期化を行い、両方を必要とするコードでAの前にBを参照するようにしてください。
+0

シングルトン使用はまれです。建設的な反応に感謝します。おそらく、静的コンストラクタのアプローチが最適です。 – sgtz

+0

私はあるインタフェースを実装する登録クラスを介して初期化を開始することを考えています。 DoSomething が呼び出され、Tが前に見たことのないアセンブリ内にある場合、指定されたIRegistrationインタフェースを持つクラスを検索します。だから、それは依存関係を取り除くだろう。 – sgtz

+0

なぜレイジーインスタンス化を使用しないことをお勧めしますか?私はFluentがこれについてどうやって行くのだろうと思っていますか?コアAPIがあり、APIは装飾されたすべてのクラスを認識する必要があります。 – sgtz

1

私は起動時に実行される非シングルトンXを導入し、あなたがそれらを必要とするようにして、どのような順序でそれらを初期化するべきかを知る責任をシングルトンから取り除く(それは、とにかく知ることは不適切です)。

そこから、私はBが明らかA.