这不是一个新颖的问题(ref),但我想尝试更简洁地提出问题以获得更好的回应。
我目前正在与同事一起处理WCF应用程序,并且我们已将代码分离到单独的项目中。我们的结构如下:
每个折叠文件夹都遵循上述惯例。
问题
循环引用问题发生在 .Models 项目和我们的 .Contracts 项目之间,因为界面经常引用模型,反之亦然。
我将通过一个简单的例子展示我的意思。
例如
在下面的例子中,我创建了两个非常简单的项目。 模型的一个项目和接口的一个项目。
从为我们建模公共对象的类型开始,例如:
namespace Example.Models
{
public class MyType
{
public int Id { get; set; }
}
} // project 1
然后我们经常创建另一个包含该类型列表的对象:
namespace Example.Models
{
public class AnotherType : ISomeInterface // let's add an interface!
{
public List<MyType> MyProperty { get; set; }
}
} // project 1
在我们决定在我们的其他项目中为这个AnotherType
类连接接口之前,这个工作正常。
namespace Example.Contracts
{
interface ISomeContract
{
List<MyType> MyProperty { get; set; }
}
} // project 2
显然,为了将MyType
添加到我们的 Example.Contracts 项目中,我们需要添加对 Example.Models 项目的引用。相反,为了将ISomeContract
添加到我们的AnotherType
课程,我们需要添加对 Example.Contracts 项目的引用。
所以我们给自己做了循环参考。
在给定的场景中,是否存在避免此循环引用问题的传统方法?或者这有缺陷吗?
对于任何有兴趣的人来说,这是简单的Example project
答案 0 :(得分:1)
如果我理解正确,您不能在不使用模型的情况下使用接口。 ISomeInterface
需要引用包含MyType
的程序集。但其中一些模型也引用了接口。
如果任何接口和模型相互引用,则它们都是同一“接口”的一部分。不是关键字中的“接口”,但它们是接口定义的合同的一部分。如果您以这种方式考虑它们会有所帮助。模型和界面共同定义了您的合同。
当你以这种方式看时,很明显这些模型和接口属于同一个程序集。它特别清楚,因为没有另一个就不存在。
实际上,我使用一个包含WCF服务合同的程序集 - 服务本身的接口以及它们将返回的任何对象。然后,WCF服务引用该合同程序集并实现它。消费者引用相同的合同,然后为方便起见,我使用Castle Windsor's WCF facility来创建WCF代理。添加奖金 - 现在您可以使用依赖注入,您不必创建代理,也不必担心关闭/处理它们。
Here's a link也在WCF服务中使用Windsor。