在接口中使用模型时避免循环引用的最佳模式

时间:2014-01-03 15:17:47

标签: .net architecture interface

我经常使用类似于下面的代码,这将导致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不允许),我认为有两个选择:

  1. 将模型移动到单独的Models程序集中,并将其添加为对InterfacesData程序集的引用。

  2. Person模型实现一个接口(例如IPerson),该接口将存在于Interfaces程序集中,并使用它代替Person in界面和它的实现。

  3. 单独的程序集包含一些小模型似乎很浪费,为仅包含属性的模型创建接口也是如此。

    最广为接受的方式是什么?

3 个答案:

答案 0 :(得分:1)

这两个选项都非常好,选择一个取决于您的偏好:

  • 如果您希望保留代码而不进行任何修改,只需重新安排组件,第一种方法就是完美的:创建额外的组件,无论它们多么小,都不会产生如此大的开销。这令人望而却步。
  • 如果您更喜欢编程接口,第二种方法是完美的:您的代码将与实现类隔离,从而无法使用一个或两个不打算使用的方法。作为附带好处,这也可以简化您的单元测试,因为用模拟对象替换接口实现是最简单的方法。

答案 1 :(得分:0)

为模型制作一个程序集,为服务接口制作另一个程序集,为服务实现制作另一个程序集。

模型类应该只依赖于其他模型类。服务接口可能依赖于模型类。服务实现可能取决于任何事情。

答案 2 :(得分:0)

作为一种技巧,模型程序集不应包含对项目中任何其他程序集的引用。 模型必须完全独立。

在模型程序集中创建所有类及其接口。 然后将实现放在另一个程序集上。