StructureMap中的循环依赖 - 它们可以通过属性注入来打破吗?

问题描述 投票:9回答:3

我在结构图中有最简单的循环依赖 - 类A在其构造函数中依赖于类B,而类B在其构造函数中依赖于类A.为了打破依赖,我让B类把A类作为属性,而不是构造函数参数,但是structmap仍然抱怨。

我已经看到在其他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 ...”

c# dependency-injection structuremap circular-dependency
3个回答
3
投票

你能得到的最接近的是这样的:

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

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


6
投票

StructureMap还可以通过使用延迟解析的解决方法来处理双向情况。

如果你有一个简单的情况,比如ClassA依赖于依赖于ClassBClassBClassA,那么你可以选择其中一个并将依赖关系转换为Lazy依赖关系。这种方式对我有用,而且这个错误再也没有出现过..

public class ClassA
{
    private readonly Lazy<IClassB> _classB;

    public ClassA(Lazy<IClassB> classB)
    {
        _classB = classB;
    }

    public IClassB ClassB => _classB.Value;
}

public class ClassB 
{
    public IClassA _classA { get; set; }

    public ClassB (IClassA classA)
    {
        _classA = classA;
    }
}

更多信息:http://structuremap.github.io/the-container/lazy-resolution/


1
投票

StructureMap可能正在执行Setter Injection,它将在其正在解析的对象上填充公共可设置属性。根据文件,

默认情况下,所有公共“Setter”都是可选的,这意味着只有在为特定实例显式配置这些setter时才会设置这些setter

那么您是否偶然设置了要自动连接的属性?如果是这样,您仍然会遇到循环依赖问题。

编辑:我知道你有。在你的实例中因为B注入了A [],StructureMap必须解析每个A对需要A []的B的依赖关系,依此类推......

© www.soinside.com 2019 - 2024. All rights reserved.