structuremap には最も単純な種類の循環依存関係があります。クラス A はそのコンストラクターでクラス B に依存し、クラス B はそのコンストラクターでクラス A に依存しています。依存関係を壊すために、クラス B がクラス A をコンストラクター引数ではなくプロパティとして受け取るようにしましたが、structuremap はまだ文句を言います。
他の DI フレームワークでこの方法を使用すると、循環依存関係が壊れているのを見てきました。これは Structuremap の問題ですか、それとも何か間違っていますか?
編集: クラス B のプロパティは、次のように配線されたクラス A インスタンスの配列であることに言及する必要があります。
x.For<IB>().Singleton().Use<B>().Setter(y => y.ArrayOfA).IsTheDefault();
明確にするために、次の一連のイベントが発生するようにします。
- B、「b」のインスタンスを構築する
- A のインスタンス「a」を構築し、そのコンストラクターに「b」を注入します
- "b.ArrayOfA" を ["a"] に設定します
そして、可能であれば、これらすべてを自動配線を使用して実現したいと考えています...
編集 2:これは、明示的な配線を使用する単純化された例です。
interface ILoader { }
interface ILoaderManager { }
class Loader : ILoader
{
public Loader(ILoaderManager lm) { }
}
class LoaderManager : ILoaderManager
{
public ILoader Loader { get; set; } // Was an array, but same circular dependency appears here
}
ObjectFactory.Configure
(
x =>
{
x.For<ILoader>.Singleton().Use<Loader>();
x.For<ILoaderManager>().Singleton().Use<LoaderManager>().OnCreation((c, a) => a.Loader = c.GetInstance<ILoader>());
}
);
構成を検証すると、「RequestedType: IocTest2.ILoader... で検出された双方向の依存関係の問題」が発生します。