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中获取某个类来实现.
那有意义吗?
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)
| 归档时间: |
|
| 查看次数: |
18659 次 |
| 最近记录: |