c# - StructureMap 中的循环依赖 - 它们可以通过属性注入(inject)来破坏吗?

标签 c# dependency-injection structuremap circular-dependency

我在 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”注入(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...”

最佳答案

StructureMap 也可以通过使用惰性解析的变通方法来处理双向情况。

如果你有一个简单的情况,比如 ClassA 依赖于 ClassBClassB 依赖于 ClassA,然后你可以选择其中之一并将依赖项转换为惰性依赖项。这种方式对我有用,那个错误再也没有出现过..

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/

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

相关文章:

c# - StructureMap -> EnrichWith 过于丰富(其他实例)

webforms - 使用 Web 表单和 DI 对象实例化的 MVP 模式

c# - Entity Framework 4.0,添加不包含主键的SQL Server View

asp.net-mvc - 应用程序池回收后 Autofac 无法解决

c# - Linq to Entities 计数子查询?

带有 ViewModel 的 Android Hilt 范围为 Navgraph,Provider Factory 问题

symfony - 我可以在编译器阶段访问语义配置吗?

dependency-injection - 为您的 IoC 提供包装器是个好主意吗?

c# - 为什么 Reactive Extensions 在编译时向微软发送 HTTP GET?

c# - 从 C 获取字节数组到 C#