当接口在单独的项目中时处理枚举

时间:2013-11-14 15:32:18

标签: c# architecture interface enums

我在Visual Studio解决方案中为应用程序提供了以下项目:

  • 常用 - 实用方法和扩展
  • 实体 - 具有特定于实例的业务逻辑的Rich Domain对象
  • 存储库 - 数据存储库
  • DataServices - 存储库的精简包装器,包含不特定于实例的业务逻辑
  • 接口 - 实体和存储库的所有接口

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

我故意在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; }  
    }
}

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

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项目。

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:2)

我要说你的基本数据类型(包括enum s,interfaceclass es)都应该在一个项目中。因此,您的Interfaces项目应该包含此enum以及任何其他常见的数据类型(可能是abstract基类型)。 Entities应继续拥有扩展和/或使用Interfaces中基本内容的特定于实现的项目。将InterfacesCommon项目合并也可能是有意义的,因为常见的逻辑和常见数据经常在一起。

答案 2 :(得分: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。枚举只不过是常量;