当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 14:00:49 C#

C#中两个项目的循环依赖我在一个解决方案中有两个项目,名为ProjectA(ConsoleApplication)和ProjectB(ClassLibrary)。项目A引用项目B。一般来说,ProjectA调用ProjectB中的一个方法进行一些操作,并将结果返回给ProjectA。但有时,我需要ProjectB向ProjectA发送一些“附加”信息(更具体地说,调用ProjectA中的Console.WriteLine()方法)。为了实现这一点,我需要在ProjectB中引用ProjectA,但是当我尝试这样做时,出现以下错误:无法添加对ProjectA的引用。添加此项目作为引用会导致循环依赖无法添加对ProjectA的引用。将此项目添加为引用会导致循环依赖。我了解整个耦合概念,收到此消息确实有意义,但是,在某些情况下,我需要向ProjectA发送其他信息。有任何想法吗?我建议你使用事件和监听器。例如,您可以通过Trace.WriteLine从ProjectB发送消息,而在ProjectA中,您可以为跟踪添加订阅者。.NET已经提供了一个ConsoleTraceListener类,用于将Trace消息路由到控制台。您可以使用以下方法从ProjectA添加侦听器:Trace.Listeners.Add(newConsoleTraceListener());或者,如果您不想使用集成类,您可以在ProjectB中构建一个非常简单的“源”类,它将使用Action公开事件作为其签名(尽管我建议您为它创建一个委托),然后订阅从ProjectA到它。通常,.NET类更灵活。项目BpublicstaticclassMyTrace{publicstaticeventActionMessageReceived;internalstaticvoidBroadcast(stringmessage){if(MessageReceived!=null)MessageReceived(message);}}项目AMyTrace.MessageReceived+=s=>{/*Operate*/};实际上可以创建具有成功编译的循环依赖项的项目,但我强烈建议不要这样做。相反,组织你的项目,使它们有一个非循环的依赖图。有很多方法可以解决这个问题,其中一些方法在其他答案中已经提到。还没有发布的是彻底去掉项目A和项目B之间的依赖,创建第三个项目C,定义了A和B通信的接口。即:namespaceC{publicinterfaceIFoo{voidFrob();}公共接口IBar{voidQux();然后使项目A和B引用项目C,并使其类实现IFoo、IBar等。当项目A中的方法需要在项目B中的对象上调用Frob时,它通过获取IFoo而不是一些来实现B类。这有意义吗?你不能那样做。如果项目相互调用,它们应该在同一个项目中。或者,ProjectB可以公开其信息,而不是ProjectB调用ProjectA,这样ProjectA就可以访问它。你不能有循环依赖。你怎么?编译器如何知道先构建哪个?您有一个基本的设计问题,这就是需要解决的问题。我实际上会在ClassB上创建自己的事件公共事件EventHandlerMySpecialHook;EventHandler是标准委托publicdelegatevoidEventHandler(objectsender,EventArgse);然后,在类A中,在创建ClassB实例之后,挂接到事件处理程序,以便在B中发生A应该知道的事情时得到通知。很像OnActivated,OnLostFocus,OnMouseMove之类的事件(但是他们委托的签名不同)更多关于C#的学习教程,希望大家多多关注—publicclassClassB{publiceventEventHandlerMySpecialHook;publicvoidSomeMethodDoingActionInB(){//做任何你需要做的事。//然后,如果有人在收听(通过下面的A类示例)//广播给任何收听这件事的人//然后他们可以根据需要从这个类中获取/做任何结果或任何其他//属性.if(MySpecialHook!=null)MySpecialHook(this,null);}}publicclassYourClassA{ClassBYourObjectToB;publicYourClassA{//创建你的类YourObjectToB=newClassB();//当此类事件需要它时,告诉B类调用你的“NotificationFromClassB”方法YourObjectToB+=NotificationFromClassB;}publicvoidNotificationFromClassB(objectsender,EventArgse){//你的ClassB做了一些你的“A”类需要处理/处理的事情。//“发送r"objectparameterISyourClassBthatbroadcastthenotification}}本文采集自网络,不代表立场,如涉及侵权请点击维权联系管理员删除,转载请注明来源: