我在Visual Studio解决方案中为应用程序提供了以下项目:
我将接口放入单独项目的原因是避免循环项目引用。这允许两个项目引用一个公共接口,避免同时引用项目和具体实现。
我故意在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项目。
答案 0 :(得分:9)
您必须将枚举定义移动到Interfaces项目或两个项目引用的单独项目。
我个人会将它们保留在同一个项目中 - 只为枚举项目设置一个单独的项目似乎有点矫枉过正。
答案 1 :(得分:2)
我要说你的基本数据类型(包括enum
s,interface
和class
es)都应该在一个项目中。因此,您的Interfaces
项目应该包含此enum
以及任何其他常见的数据类型(可能是abstract
基类型)。 Entities
应继续拥有扩展和/或使用Interfaces
中基本内容的特定于实现的项目。将Interfaces
与Common
项目合并也可能是有意义的,因为常见的逻辑和常见数据经常在一起。
答案 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。枚举只不过是常量;