2009-12-03 65 views
0

我的问题:在应用程序内部,所有接口都是在自己的dll(例如项目“接口”)中声明的。接口DLL中的类实现?

项目接口内部也有很多类实现。

现在我需要在另一个项目中实现这些类中的一个,并获得环形依赖项,因为此项目也是项目接口中的参考。

那么,解决这个环依赖的最好方法是什么?有可能这是应用程序设计中的一个重大错误吗?

示意图:

IBigInterface.cs(一切都在一个文件中):

interface ISomeInterfaceA 
{ 
    void SomeFunctionA(ClassB x); // ClassB from newProject.cs 
    void SomeFunctionB(); 
} 

// 
// etc. 
// 
class ClassA 
{ 
    // 
    // Code 
    // 
} 
(在一个文件中的所有内容)

newProject.cs:

class ClassB 
{ 
    // 
    // used in interfaces.dll 
    // 
} 

class ClassC 
{ 
    void SomeFunction(ClassA a) // ClassA from IBigInterface.cs 
    { 
     // 
     // do something 
     // 
    } 
} 

即进入第一件事我的想法是。像:

IBigInterface.cs:

interface ISomeInterfaceA 
{ 
    void SomeFunctionA(IInterfaceB x); // use interface instead of a class 
    void SomeFunctionB(); 
} 

interface IInterfaceB 
{ 
    // 
    // declarations 
    // 
} 

class ClassA 
{ 
    // 
    // implementation 
    // 
} 

newProject.cs:

class ClassB : IInterfaceB // implementation of IInterfaceB 
{ 
} 

class ClassC 
{ 
    void SomeFunction(ClassA a) 
    { 
     // 
     // implementation 
     // 
    } 
} 

使项目newProject不会在项目界面参考了(尽管这意味着在整个变化应用)。

P.S .:我继承了这个应用程序,所以在接口项目中实现类的想法不是我的想法:)。 一般来说,我会为每个类创建一个文件(所以不要指向这:)。

回答

6

首先,将具体类和它们实现的接口组合到一个程序集中是没有问题的(尽管调用项目“接口”会有点奇怪)。

话虽如此,循环引用通常表示您已将代码过度模块化:引起循环引用的部分属于一起,它们应合并到一个程序集中。

其他时候,循环引用只是一个类在错误层的标志;该课程需要完全转移到另一个程序集中(通常从较低级别的基础结构程序集到更高级别的程序集中)。例如,ClassC可能真的属于引用“interfaces”程序集的另一个项目。

+0

“引起循环引用的部分属于一起” - 我同意你的一般意见,但也可能是因为属于顶层的组件被置于底层。我有不幸接管这样的代码:(花了我几天的时间来修复,并将组件移动到正确的层次上。 – Pete 2009-12-03 14:25:42

+0

@Pete - true!更新我的答案。 – 2009-12-03 14:57:02

1

这就是为什么Java 需要公共定义在自己的文件(但我认为你在这里得到的概念:))。

混合纯粹的接口和实现通常并不好(虽然有些情况下它可能会有用),如果将它们导出为DLL,它肯定是一个麻烦制造者。

循环依赖意味着您的项目过于耦合而不同。这通常是不良设计的症状(如big ball of mud -like)。你应该去除那个耦合或者把两个项目合并在一起。

1

如果您有一个特定的项目,如您所说,它包含您的所有界面,为什么不引入另一个包含“帮助类”的项目,如ClassA?然后你的接口DLL和依赖于接口DLL的项目可以使用这些类。

0

我会尝试将几个项目通用的类和接口分解成一个“Common”程序集(或类似的),它对引用它的程序集没有依赖关系。

例如,如Product商业实体不必知道它是如何坚持通过Web服务数据库或取出任何东西,但服务组件事情Product,例如IProductsRepository,需要知道什么是Product。因此,其中IProductsRepository定义的程序集(或名称空间)拥有对程序集(或名称空间)的引用,其中Product存在于其中,但不是其他方式。