C#中两个项目的循环依赖

Ari*_*edi 12 c# circular-dependency

我在名为ProjectA(ConsoleApplication)和ProjectB(ClassLibrary)的解决方案中有两个项目.ProjectA引用了ProjectB.一般来说,ProjectA调用ProjectB中的方法来执行一些操作并将结果返回给ProjectA.但有时候,我需要ProjectB向ProjectA发送一些"附加"信息(更具体地说是调用Console.WriteLine()ProjectA中的方法).为了实现这一点,我需要在ProjectB中引用ProjectA,但是当我尝试这样做时,我收到以下错误:

A reference to ProjectA could not be added. Adding this project as a reference would cause a circular dependency.

我理解整个耦合概念,并且获取此消息确实有意义,但是,在某些情况下,我需要向ProjectA发送其他信息.有任何想法吗?

Eri*_*ert 15

实际上可以创建具有循环依赖关系的项目,这些项目可以成功编译,但我强烈建议不要使用它.相反,组织您的项目,以便他们有一个非循环依赖图.

有许多方法可以解决这个问题,其中一些已经在其他答案中提到过.尚未发布的是完全消除项目A和项目B之间的依赖关系,并创建第三个项目C,它定义A和B通信的接口.那是:

namespace C
{
    public interface IFoo { void Frob(); }
    public interface IBar { void Qux(); }
}
Run Code Online (Sandbox Code Playgroud)

然后使项目A和B引用项目C,并使其类实现IFoo,IBar等.当项目A中的方法需要在项目B中的对象上调用Frob时,它通过获取IFoo而不是在B中获取某个类来实现.

那有意义吗?

  • 你激起了我的好奇心 - 如何创建具有循环依赖关系的项目,这些项目可以成功编译? (4认同)

Mir*_*Mir 10

我建议你使用事件和听众.例如,您可以通过ProjectB发送消息,Trace.WriteLine而在ProjectA中,您可以为跟踪添加订户..NET已经提供了一个ConsoleTraceListener类,用于将Trace消息路由到控制台.您可以通过以下方式从ProjectA添加侦听器:

Trace.Listeners.Add(new ConsoleTraceListener());
Run Code Online (Sandbox Code Playgroud)

或者,如果您不想使用集成类,您可以在ProjectB中构建一个非常简单的"源"类,它将公开一个带有Action<string>签名的事件(尽管我建议您为它创建一个委托),然后从ProjectA订阅它.通常,.NET类更灵活.

项目B

public static class MyTrace
{
    public static event Action<string> MessageReceived;

    internal static void Broadcast(string message)
    {
        if (MessageReceived != null) MessageReceived(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

项目A

MyTrace.MessageReceived += s =>
{
    /*Operate*/
};
Run Code Online (Sandbox Code Playgroud)