【问题标题】:Traversing dependency graph in StructureMap在 StructureMap 中遍历依赖图
【发布时间】:2014-09-25 16:42:51
【问题描述】:

我在 StructureMap 中找不到任何遍历依赖关系图的机制。 我的问题如下:

Coordinator 类有两个依赖项:ServiceAServiceBServiceAServiceB 都有一个依赖项:CustomWebClientCustomWebClient 有一个依赖项:Logger

我必须将Logger 的不同实现注入CustomWebClient。这取决于CustomWebClient是注入ServiceA还是ServiceB

我发现的唯一条件机制是基于父类型和根类型,但在我的情况下没有帮助。是否可以在 StructureMap 中进行配置?

【问题讨论】:

  • 应该能够创建一个新的CustomWebClientB,它派生自CustomWebClient,它依赖于LoggerB?如果ParentTypeServiceB,则有条件地使用它。
  • 谢谢,但我真的不想那样做。实际情况比较复杂,我将其简化以表达问题的本质。在我们的项目中,有 6 种服务。除此之外,CustomWebClient 有几个装饰器。我想避免再创建 18 个类。
  • 是的,这改变了一切。

标签: c# .net dependency-injection structuremap


【解决方案1】:

虽然我没有找到任何以正常方式执行此操作的方法,但我发现 StructureMap 在内部存储了依赖堆栈。

StructureMap 2.6.4.0 中,我们可以使用构建堆栈帧:

container.For<Logger>().AlwaysUnique().Use(ctx =>
{
    var pi = typeof (BuildFrame).GetProperty("Parent", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
    var frame = ctx.BuildStack.Parent;

    while (frame != null)
    {
        var currentType = frame.ConcreteType;

        if (currentType == typeof(ServiceA))
            return new LoggerA();
        if (currentType == typeof(ServiceB))
            return new LoggerB();

        frame = (BuildFrame)pi.GetValue(frame, null);
    }

    return new LoggerDefault();
}

StructureMap 3.1.2.0 中,我们必须使用 BuildSession 对象的 _instances 私有字段(IContext 实现)。 _instances 字段具有以下类型:Stack&lt;Instance&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多