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

    }

     
     
  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/jx270/p/3618720.html
Copyright © 2011-2022 走看看