9

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... で検出された双方向の依存関係の問題」が発生します。

4

3 に答える 3

3

あなたが得ることができる最も近いものは次のようなものです:

x.For<IB>().Use<B>()
    .OnCreation((ctx, instance) =>
    {
        instance.ArrayOfA = new IA[] {new A(instance) };
    });

Aコンテナーから解決したい他の依存関係がある場合はctx、OnCreation ラムダ内からそれらを取得できます。

于 2010-05-06T18:32:07.537 に答える
1

StructureMapは、解決対象のオブジェクトにパブリック設定可能プロパティを設定するセッターインジェクションを実行している可能性があります。ドキュメントによると、

デフォルトでは、すべてのパブリック「セッター」はオプションです。つまり、これらのセッターは、特定のインスタンス用に明示的に構成されている場合にのみ設定されます。

それで、あなたはたまたま自動配線されるようにプロパティを設定しましたか?その場合でも、循環依存の問題が発生します。

編集:あなたが持っていることがわかります。あなたのインスタンスでは、BにA []が注入されているため、StructureMapは、A[]を必要とするBに対する各Aの依存関係を解決する必要があります。

于 2010-05-06T15:43:31.033 に答える