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

    }

     
     
  • 相关阅读:
    转载 如何去掉超链接文字下的下划线
    Fedora 15安装 VirtualBox 4.1
    庆祝开通!
    Delphi直接读写XML修改版
    Perforce的资料一点也没查到
    AxWebBrowser的Navigate2方法写参数的偷懒方法
    腾讯2012实习生面试
    如何让div在IE6下自适应
    PhpStorm修改字体
    监听url
  • 原文地址:https://www.cnblogs.com/jx270/p/3618720.html
Copyright © 2011-2022 走看看