遍历StructureMap中的依赖图

时间:2014-09-25 16:42:52

标签: c# .net dependency-injection structuremap

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

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

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

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

1 个答案:

答案 0 :(得分:0)

虽然我没有找到任何方法以正常方式执行此操作,但我发现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 中,我们必须使用_instances对象的BuildSession私有字段(IContext实现)。 _instances字段具有以下类型:Stack<Instance>