8

我在应用程序的 Visual Studio 解决方案中有以下项目:

  • 通用 - 实用方法和扩展
  • 实体 - 具有特定于实例的业务逻辑的富域对象
  • 存储库 - 数据存储库
  • DataServices - Repositories 的瘦包装器,包含不特定于实例的业务逻辑
  • 接口 - 实体和存储库的所有接口

我将接口放入单独项目的原因是避免循环项目引用。这允许两个项目引用一个公共接口,避免同时引用具有具体实现的项目。

我故意在 Interfaces 项目中没有项目引用,以避免循环项目引用。我为其他项目中定义的类创建一个接口,这允许我引用对象接口,而不是其他接口中的具体实现。

所以一个例子是:

namespace Acme.Entities 
{
   public class Person : IPerson
   {
       string Name { get; set; }
   }
}
namespace Acme.Interfaces
{
    public interface IPerson
    {
        string Name { get; set; }
    }
}

namespace Acme.Interfaces
{
    public interface ITeam
    {
        string Name { get; set; }
        IPerson Leader { get; set; }  
    }
}

我遇到的问题是当接口引用另一个项目中定义的枚举时。如果不移动接口项目下的枚举,我不确定如何在不创建项目引用的情况下引用枚举,例如:

namespace Acme.Entities 
{
   public enum Status
   {
       Unknown =0,
       Active = 1,
       Active = 2    
   }
} 

namespace Acme.Interfaces
{
    public interface IPerson
    {
        string Name { get; set; }
        Acme.Entities.Status ActiveStatus { get; set; }  
    }
}

除非我引用 Acme.Entities 项目,否则 Acme.Entities.Status 将失败,但这将创建循环引用,因为 Acme.Entities 引用了 Interfaces 项目。

4

3 回答 3

9

您必须将枚举定义移至 Interfaces 项目或两个项目都引用的单独项目。

我个人会将它们保留在同一个项目中 - 为枚举创建一个单独的项目似乎有点矫枉过正。

于 2013-11-14T15:34:28.793 回答
2

我想说你的基本数据类型(包括enums、interfaces 和classes)都应该在一个项目中。因此,您的Interfaces项目应该包括 thisenum以及任何其他常见的数据类型(可能是abstract基本类型)。Entities应该继续拥有扩展和/或使用Interfaces. Interfaces与您的项目合并可能也很有意义Common,因为公共逻辑和公共数据经常一起出现。

于 2013-11-14T15:35:54.703 回答
0

如果您以正确的方式定义组件和接口,那么您将永远不会遇到这个问题。

我建议首先使用以下两个原则审查您的代码和应用程​​序架构:

http://en.wikipedia.org/wiki/Single_responsibility_principle http://en.wikipedia.org/wiki/Interface_segregation_principle

Domain Driven Desgin ---> 非常无能的规则: http ://en.wikipedia.org/wiki/Domain-driven_design

我也同意您必须将 SHARED Enums 移动到一个常见的 IConstants.cs。枚举只不过是常量。

于 2013-11-14T15:49:10.580 回答