代码之家  ›  专栏  ›  技术社区  ›  Finglas

C中的接口和其他依赖项应该放在哪里?

  •  0
  • Finglas  · 技术社区  · 15 年前

    我所说的其他依赖性是指抽象类和其他任何类。

    我有一个项目的形式是 dll 这需要一定的 interface , IInput . 一个测试项目也需要这个接口,所以我把这个接口放在我的主项目中,而主项目又是一个单独的exe程序集。

    这是因为最终当我将所有东西连接在一起时,主项目将需要使用这个接口。现在我遇到的问题是,当我试图在主项目中添加一个引用到DLL,并引用主项目时,我收到了一个循环依赖项。

    我以前从来没有遇到过这个问题,我也不知道最好的解决方法。作为临时修复,我已经将接口移动到单独的dll,但很快我将在主项目中需要它,所以我回到square one。

    编辑:

    我本应该提到设计的,所以这里是。

    Menu
    Menu Tests
    Runner
    

    菜单有iinput,它实际上是第三方库的接口适配器,以允许单元测试。

    所以菜单需要这个来输入,但是运行程序也需要。运行程序项目(exe)需要输入,因此我需要再次输入。

    5 回复  |  直到 15 年前
        1
  •  6
  •   Yannick Motton    15 年前

    由于接口不应该与测试项目或主项目有任何关联,所以只需将其移动到单独的程序集,并从测试和主项目引用此程序集。

    MySolution
     |->Interfaces.dll
     |->MainProject.exe (references Interfaces.dll)
     |->TestProject.exe (references Interfaces.dll)
    
        2
  •  2
  •   Agent_9191    15 年前

    为什么不这样设置结构:

    Solution
      + Project With Interface
        - IInput
      + Main Project/UI
        -> Reference "Project With Interface"
      + Test Project
        -> Reference "Project With Interface"
    

    没有循环引用,它实际上是直接引用用法。

        3
  •  1
  •   Dan Tao    15 年前

    循环依赖关系表示设计存在问题。接口应该放在定义所属的任何位置。如果您有两个相互依赖的项目,它们可能属于一个项目,或者(更可能)--如果您的dll是“真正的”库,您的主项目是 利用 --然后将接口放入DLL。

    我这样说的前提是假设“dll”指的是“类库”。如果你字面意思是一个编译后的dll,你不能对其进行修改,那么就把这个接口放在一个新的库中。

        4
  •  0
  •   Jimmeh    15 年前

    我认为接口应该在dll中,主项目应该引用dll,并且有一个实现接口的适配器类。我想,测试项目将引用主项目和DLL。

        5
  •  0
  •   Klaus Byskov Pedersen    15 年前

    我不认为这个问题只与接口有关。它也可以是抽象类或其他类。听起来你的总体架构有问题。

    但是,要解决这个问题,只需创建一个包含接口的新类库,其他三个项目可以引用这个类库。

    克劳斯