比如说酒店软件,两个模块fo.dll和pos.dll(都有Form1,Form2...等主窗体,反射调用,必须有,主要是列表;其它是子窗体,如下面的前台客人帐和餐厅结帐)pos挂前台客人帐时(pos.jz)需要调用fo.Form1取客人列表来决定挂到哪个客人帐中(fo.bill)
所以pos.dll引用fo.dllpos挂完帐后(在数据库中插入一条记录),财务需要在fo.bill窗体中查看pos这笔帐的明细(具体吃的什么菜)
所以fo.dll又要引用pos.dll这就导致了循环引用,肯定是不行的,请问应该怎么样解决?!

解决方案 »

  1.   

     这样的问题就是把公共需要的部分再抽一个dll出来,然后你的原来的2个dll引用这个。问题就解决了。
      

  2.   

    自定义接口,实现公共的操作
    类实现继承操作
    其他业务操作引用公共的DLL
      

  3.   

    解决不了,我主要引用的是界面
    fo.Form1里是Tab,每页里是一个Grid,pos中要引用的就是这些Grid
    fo.bill中要引用的也是pos.bill中的Grid
      

  4.   

    如果无法再次拆分那就合并,把所有相关的dll合并为1个。
      

  5.   

    不理想,所有功能都放在一个文件里,太乱了,而且单个文件也会比较大!
    我现在只想到了将fo.Form1的源文件复制到pos文件夹中,但这样又会造成没必要的重复,而且容易搞错(可能会忘了同步)!
      

  6.   

    从你的描述,合并是最合适的方案了。因为彼此耦合过高,要拆分,则只能是公共的窗体独立一个dll,然后通过策略模式给窗体配置行为。这样就拆开了。否则就把2个dll合并好了,功能上交集这么多。拆开不合适。
      

  7.   


    要不,你把这些Grid放在一个DLL当中怎样?
      

  8.   

    fo.Form1是该模块主窗体,还要调用其它窗体,所以这个必须有!
      

  9.   

    fo和pos都有form1,form2...(动态调用)
    将来说不定哪个还要扩展,如果合并的话只能将pos的主窗体改为Form51,Form52...
    唉,郁闷!~
      

  10.   

    先开发接口,比如ipos.dll,再开发pos.dll实现接口功能。
    fo.dll引用ipos.dll,然后实现反射创建,那样就不需要直接引用pos.dll了。
    例子:
    namespace ipos
    {
    interface iClass1
    {
         void Method1();
    }
    }using iPos;
    namespace pos
    {
       public class Class1:iClass1
       {
           public void Method()
           {.....}
        }
    }using iPos;
    namespace fo
    {
         public class Class2
        {
             public iClass1 class1;
             
             public Class2()
            {
                class1=Assembly.Load("Pos").CreateInstance("Pos.Class1");
             }
            .................
         }
    }
    先学习依赖注入,反射创建的原则你就能立即明白。
    但此用法一般只用于Factory、Repository等底层开发,并非随处适用,滥用会导致增大系统负荷,阁下可以按需要酌情处理。
      

  11.   

    QQ群:59557329 .NET技术开发联盟
    希望大家可以踊跃参加,积极讨论