zoukankan      html  css  js  c++  java
  • 避免循环依赖

    在2个项目中相互引用工程会提示 将导致循环依赖,如果相互引用的dll可以暂时规避,但日后改成引用工程则会仍报错,解决办法如下:
    using System;

    namespace ConsoleAppPreventCircularDependency
    {
    class Program
    {
    static void Main(string[] args)
    {
    //A a = new A();
    //a.MethodA();
    ////System.StackOverflowException

    AA aa=new AA();
    aa.MethodAA();
    }
    }

    /*
    * 双向耦合在同一个项目下,只是设计问题;
    * 在不同项目中,必须解耦,否则项目之间互相引用会提示 将导致循环依赖项
    *
    * 一般来说,不应该存在双向耦合,有此情况则应考虑重构
    */

    #region 解耦前的代码

    class A
    {
    private B b;

    public void MethodA()
    {
    Console.WriteLine("MethodA 已调用!");
    b = new B();
    b.MethodB();//“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
    }
    }

    class B
    {
    private A a;

    public void MethodB()
    {
    Console.WriteLine("MethodB 已调用!");
    //请在循环调用的某个地方,添加相关中止语句,否则会报错 栈溢出
    a = new A();
    a.MethodA();
    }
    }

    #endregion

    #region 解耦后的代码

    /*
    * AA,BB分别在2个不同的项目中,提炼一个接口,放置在一个新起的项目中,
    * 然后AA,BB所在的项目引用该接口所在的项目。
    */

    interface ISample
    {
    void MethodAA();
    }

    class AA : ISample
    {
    private BB bb;
    public void MethodAA()
    {
    Console.WriteLine("MethodAA 已调用!");
    bb = new BB();
    bb.MethodBB();//“System.StackOverflowException”类型的未经处理的异常在 mscorlib.dll 中发生
    }
    }

    class BB
    {
    private ISample aa;

    public void MethodBB()
    {
    Console.WriteLine("MethodBB 已调用!");
    //请在循环调用的某个地方,添加相关中止语句,否则会报错 栈溢出
    aa = new AA();
    aa.MethodAA();
    }
    }

    #endregion

    }

     
     
  • 相关阅读:
    Netty学习(四)-TCP粘包和拆包
    Netty学习(三)-Netty重要接口讲解
    Netty学习(二)-Helloworld Netty
    Netty学习(一)-为什么选择Netty
    java学习-NIO(五)NIO学习总结以及NIO新特性介绍
    java学习-NIO(四)Selector
    哈希表 HashTable(又名散列表)
    设计模式-外观模式
    设计模式-装饰模式
    设计模式-适配器模式
  • 原文地址:https://www.cnblogs.com/jx270/p/3618720.html
Copyright © 2011-2022 走看看