我在结构图中有最简单的循环依赖关系-类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”注入(inject)其构造函数
  • 将“b.ArrayOfA”设置为[“a”]

  • 我希望如果可能的话,使用 Autowiring 来实现所有这些...

    编辑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 ...的双向依赖性问题”。

    最佳答案

    您可以得到的最接近的东西是这样的:

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

    如果A还有其他要从容器中解析的依赖项,则可以从OnCreation lambda的ctx中检索它们。

    关于c# - StructureMap中的循环依赖关系-可以通过属性注入(inject)来打破它们吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2782299/

    10-10 13:34
    查看更多