避免模​​型项目和合同项目之间的循环引用

时间:2016-05-13 15:51:54

标签: c# asp.net

这不是一个新颖的问题(ref),但我想尝试更简洁地提出问题以获得更好的回应。

我目前正在与同事一起处理WCF应用程序,并且我们已将代码分离到单独的项目中。我们的结构如下:

enter image description here

每个折叠文件夹都遵循上述惯例。

问题

循环引用问题发生在 .Models 项目和我们的 .Contracts 项目之间,因为界面经常引用模型,反之亦然。

我将通过一个简单的例子展示我的意思。

例如

在下面的例子中,我创建了两个非常简单的项目。 模型的一个项目和接口的一个项目。

enter image description here

从为我们建模公共对象的类型开始,例如:

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

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您不能在不使用模型的情况下使用接口。 ISomeInterface需要引用包含MyType的程序集。但其中一些模型也引用了接口。

如果任何接口和模型相互引用,则它们都是同一“接口”的一部分。不是关键字中的“接口”,但它们是接口定义的合同的一部分。如果您以这种方式考虑它们会有所帮助。模型和界面共同定义了您的合同。

当你以这种方式看时,很明显这些模型和接口属于同一个程序集。它特别清楚,因为没有另一个就不存在。

实际上,我使用一个包含WCF服务合同的程序集 - 服务本身的接口以及它们将返回的任何对象。然后,WCF服务引用该合同程序集并实现它。消费者引用相同的合同,然后为方便起见,我使用Castle Windsor's WCF facility来创建WCF代理。添加奖金 - 现在您可以使用依赖注入,您不必创建代理,也不必担心关闭/处理它们。

Here's a link也在WCF服务中使用Windsor。