如何连接点?

请观察使用MEF作为依赖注入框架的以下简单程序:

using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;

namespace ConsoleApplication2
{
    [InheritedExport]
    public interface ITest
    {
        void DoSomething();
    }

    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class Test : ITest
    {
        #region Implementation of ITest

        public void DoSomething()
        {
            Program.BackToProgram();
        }

        #endregion
    }

    [Export]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class TestClient
    {
        private readonly ITest m_test;

        [ImportingConstructor]
        public TestClient(ITest test)
        {
            m_test = test;
        }

        public void DoSomethingFromTestClient()
        {
            m_test.DoSomething();
        }
    }

    class Program
    {
        private static CompositionContainer m_container;

        static void Main()
        {
            m_container = new CompositionContainer(new TypeCatalog(typeof(Test), typeof(TestClient)), true);
            var testClient = m_container.GetExportedValue<TestClient>();
            testClient.DoSomethingFromTestClient();
        }

        public static void BackToProgram()
        {
        }
    }
}

现在让我们用NDepend 6.3进行分析。 假设我想知道Program.BackToProgram所有直接和间接调用者: 在这里输入图像描述

但是,类TestClient通过ITest接口使用依赖注入来消费一个Test实例,因此寻找ITest.DoSomething的直接和间接调用者给了我这个: 在这里输入图像描述

所以,这给了我完整的画面 - Program.BackToProgram最终从Program.Main调用。

不幸的是,我不得不求助于手动代码检查来连接点。 依赖注入似乎破坏了NDepend跟踪DI边界内什么的能力。

虽然这可以通过以下事实来解释:DI很大程度上依赖于反射,并且反射并不真正适用于静态代码分析,但这构成了一个大问题,因为我们的代码使用DI相当多。

那么,有没有解决这个问题的方法? 有没有办法配置NDepend来识别由MEF实现的依赖注入? 在一天结束的时候,当被问及Program.BackToProgram所有直接和间接调用者时,我希望看到Program.Main在没有人为干预的情况下。

也许有另一种工具可以做到吗?

编辑1

来自NDepend团队的Patrick提供的答案很有趣,但它不够好。 确实,它返回涉及的方法,但调用者图被断开: 在这里输入图像描述

因此,对于这个人为的例子,可以推断出缺失的联系。 但是这种奢侈品在广泛使用DI的生产代码中是不可用的。 我们将结束许多不连贯的子图。 这对跟踪呼叫者没有任何帮助。


链接地址: http://www.djcxy.com/p/37725.html

上一篇: how to connect the dots?

下一篇: See the effects of a change in a shared assembly on an upstream application