1

Using NDepend, how can we removed Cycle Dependencies generated by the compiler due to Tasks (TPL) from the Dependency Matrix.

If we cannot remove them, then how can we easily differentiate them from important cycle dependencies that need our attention.

Are there any best practices around dealing with compiler generated cycle dependencies?

Edit:

The compiler generated dependency cycle can be observed in the top left of the diagram

The compiler generated dependency cycle can be observed in the top left of the diagram

Code that generates a Dependency Cycle (Compiles in .Net 4.0)

*logger is a field in my class

  private void WriteJsonFileToDiskAsync(string filePath, string json)
    {
        Task.Factory.StartNew(() => WriteJsonFileToDisk(filePath, json))
            .ContinueWith(HandleWriteException);
    }

    private void WriteJsonFileToDisk(string filePath, string json)
    {
        Stream fileStream = null;
        try
        {
            fileStream = File.Create(filePath);
            using (var writer = new StreamWriter(fileStream))
            {
                fileStream = null;
                writer.Write(json);
            }

            logger.InfoIfDebuggerIsAttached(string.Format(CultureInfo.InvariantCulture, "Persisted file: {0}", filePath));
        }
        finally
        {
            if (fileStream != null)
                fileStream.Dispose();
        }
    }

    private static void HandleWriteException(Task task)
    {
        if (task.IsFaulted)
        {
            //TODO: Handle Exception
        }
    }
4

1 回答 1

1

Alexandre,在编译完你的源代码后,我得到了以下依赖矩阵:

在此处输入图像描述

我们可以看到编译器生成了一个在Program您内部声明的子类型。这个生成的类型,命名Program+<>c__DisplayClass1只是编译器体操,它不是你的源代码的一部分。这不是问题,这两种类型都是相互依赖的,您对此无能为力。

要丢弃生成的类型,您可以编写如下查询...

from t in Application.Types
where !t.IsGeneratedByCompiler
select t

...然后将部分结果导出到矩阵:

在此处输入图像描述

最后,我想补充一点,在一般情况下,相互依赖的类型不是问题。大多数著名的GoF 设计模式都需要相互依赖的类型。

问题是当您有相互依赖的组件时,尤其是当这些组件是命名空间时。NDepend 网站上有两本关于这个主题的白皮书公开可用。

类型相互依赖的问题之一是当基类使用派生类时(有一个默认的 CQLinq 规则基类不应为此使用派生类

于 2013-05-23T16:24:32.503 回答