程序集A1中的C类实现了程序集A2的接口。使用C时,需要同时引用A1和A2

时间:2011-10-12 19:12:04

标签: .net architecture dependencies

根据this SO question

中的答案,这是设计的

但是我真的不想引用这两个程序集,感觉我打破了封装(A1的用户不应该知道A1使用A2来实现它)。

我想将接口定义移动到另一个程序集,让我们称之为“Core”,并让A2和A1的客户端引用它。这让我觉得更清洁。

我的问题是:这是好设计吗?或者是否有一个我不知道的标准.NET解决方案?另一方面,我担心“核心”最终会成为一个完全不相关的界面的混乱...你觉得怎么样?

3 个答案:

答案 0 :(得分:2)

首先,这并没有打破封装。

封装意味着实现细节不相关 - 只要您编程到接口,封装就完好无损。

其次 - 如果要同时使用接口和实现,则需要引用两者都在的程序集(忽略插件体系结构)。你的代码还有什么用呢?如果没有对实现的引用,则无法实例化具体类型。如果没有对该接口的引用,则不能在代码中使用它。

答案 1 :(得分:1)

C#没有私有继承。如果A1类实现接口A2,那么这是公共信息,它暴露给A1类用户,就像A2是基类而不是接口一样。

是的,您必须引用这两个程序集。

答案 2 :(得分:0)

我满意地解决了,请告诉我你的想法:

(警告:这是特定于IDE的,不知道我是否可以将它拉出来,比如SharpDevelop)

  1. 在A1中,不是引用A2程序集,而是在Visual Studio中右键单击A1项目并选择“添加现有项”。选择接口文件。 在按下添加按钮之前,请注意它是一个下拉按钮:将其删除并选择“添加为链接”。如果你不这样做,你将不得不保留界面的多个副本,这是一个麻烦

  2. 删除从A1到A2的引用(如果您使用它的全部是界面)

  3. 瞧! A1的客户只需要参考A1。我想这是因为现在界面是在A1和A2组件中定义的类型。我不认为这会危及manteinance,因为接口仍然只在一个源代码文件中定义。好的,它被编译成两个程序集,所以它是一种“二进制复制”,但我不认为这很糟糕......你呢?