【发布时间】:2014-01-21 07:24:38
【问题描述】:
我经常得到类似于下面的代码,这会导致 Visual Studio 中的循环引用:
(这两个命名空间存在于不同的程序集中)
namespace Data
{
public class DataContext : IDataContext
{
public IEnumerable<Person> GetAllPeople()
{
// Get all people here
}
}
}
namespace Interfaces
{
public interface IDataContext
{
IEnumerable<Person> GetAllPeople();
}
}
接口 (IDataContext) 和它的实现 (DataContext) 都依赖于名为 Person 的模型。
为了避免循环引用(Visual Studio 不允许),我认为有几个选择:
将模型移动到单独的
Models程序集中,并将其添加为对Interfaces和Data程序集的引用。让
Person模型实现一个接口(例如IPerson),该接口将存在于Interfaces程序集中,并在接口及其实现中使用它代替Person。
让一个单独的程序集包含几个小模型似乎很浪费,为只包含属性的模型创建接口也是如此。
最广泛接受的方法是什么?
【问题讨论】:
-
您是否需要将接口和实现放在单独的程序集中?您是否曾经部署过一个而不是另一个?如果没有,请将所有内容放在同一个程序集中。 codebetter.com/patricksmacchia/2008/12/08/…
-
这是我对非常相似的情况的看法:stackoverflow.com/a/20883444/122718 TL;DR:如果可能,合并程序集。
-
@IanNelson 不,但是在接口相互依赖的更复杂的项目中,我们发现将接口与实现一起存在可能会导致更多的循环引用问题。至少通过这种方式,接口程序集只需要依赖于自身(并且可能还依赖于模型程序集)。
-
在我看来,以这种方式物理分离类型有点过早分解。我会把所有东西都放在一个程序集中——模型、接口、实现、整个shebang。当然,我会适当地使用命名空间来进行 logical 分组。
标签: .net architecture interface