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

    }

     
     
  • 相关阅读:
    前端页面实现报警器提示音效果
    Bootstrap相关优质项目学习清单
    Bootstrap相关优质项目学习清单
    [慕课笔记] node+mongodb建站攻略
    基础知识(11)- 异常、断言、日志和调试
    洛谷 P2580 于是他错误的点名开始了
    codevs 4189 字典
    HDU 1251 统计难题
    HDU 1827 Summer Holiday
    HDU 3836 Equivalent Sets
  • 原文地址:https://www.cnblogs.com/jx270/p/3618720.html
Copyright © 2011-2022 走看看