.net 公司架构要求我们在三个地方定义相同的枚举?

.net 公司架构要求我们在三个地方定义相同的枚举?,.net,architecture,.net,Architecture,我们公司的架构被吹捧为松散耦合,并提供了很好的关注点分离。但是,我想知道我们是否“做对了” 例如,假设我们的业务/客户层中有一个Car对象。这辆车上有一个“CarEnum”。当我们准备将汽车保存到数据库时,我们会将汽车映射到CarDTO,CarDTO也有一个CarEnum,其选项与业务层枚举中的选项完全相同。当我们的DTO到达服务器代码时(在另一个解决方案中),DTO被映射到另一个模型,该模型具有与业务和DTO枚举完全相同的定义 这感觉不对 我没想到“好的架构”会涉及在三个地方定义相同的枚举。我

我们公司的架构被吹捧为松散耦合,并提供了很好的关注点分离。但是,我想知道我们是否“做对了”

例如,假设我们的业务/客户层中有一个Car对象。这辆车上有一个“CarEnum”。当我们准备将汽车保存到数据库时,我们会将汽车映射到CarDTO,CarDTO也有一个CarEnum,其选项与业务层枚举中的选项完全相同。当我们的DTO到达服务器代码时(在另一个解决方案中),DTO被映射到另一个模型,该模型具有与业务和DTO枚举完全相同的定义

这感觉不对


我没想到“好的架构”会涉及在三个地方定义相同的枚举。我以为代码应该是。这是一个很好的架构,还是这只是迫使整个公司进行怪异的货运狂热编程?什么是更好的替代体系结构?

如果层之间需要分离(即物理边界),那么这是一件好事。如果没有,则是架构再次出现。

如果层之间需要分离(即物理边界),则这是一件好事。如果没有,那又是架构的问题。

在3个位置定义“相同”枚举肯定是架构\设计的问题

有一个用于“共享类型”的程序集是很常见的。这通常包含以下内容:跨层有意义的接口、DTO、异常和枚举。重要的是,它本身不包含任何行为\逻辑。然后,您的不同层可以共享此部件,而无需担心耦合

在3个位置定义“相同”枚举肯定是架构\设计的味道


有一个用于“共享类型”的程序集是很常见的。这通常包含以下内容:跨层有意义的接口、DTO、异常和枚举。重要的是,它本身不包含任何行为\逻辑。然后,您的不同层可以共享此部件,而无需担心耦合

这不是松耦合——而是定义CarEnum的所有位置都是紧耦合的。如果有人不相信这一点,只要问问他们,如果你在其中一个文件中的现有文件之间添加了一个新选项,而不接触其他文件,会发生什么情况。这就是松散耦合代码的定义——您可以在一个地方更改细节,而不会影响其他地方


无论何时复制这样的定义,都应该对其进行重构并将其提取到自己的文件中。现在,所有这三个位置都与新文件紧密耦合,但彼此不紧密耦合。

这不是松耦合,而是定义CarEnum的所有位置都紧密耦合。如果有人不相信这一点,只要问问他们,如果你在其中一个文件中的现有文件之间添加了一个新选项,而不接触其他文件,会发生什么情况。这就是松散耦合代码的定义——您可以在一个地方更改细节,而不会影响其他地方


无论何时复制这样的定义,都应该对其进行重构并将其提取到自己的文件中。现在,所有这三个位置都与新文件紧密耦合,但彼此不紧密。

是否将CarEnum传递给DTO?嗯,不完全是这样。CarEnum被映射到一个CarDTOEnum,该CarDTOEnum的定义与CarEnum.hmm相同,似乎您可以从全局枚举定义中获益。您是否将CarEnum传递给DTO?嗯,不完全是这样。CarEnum正在映射到CarDTOEnum,其定义与CarEnum.hmm相同,似乎您可以从全局枚举定义中获益“物理边界”是什么意思?对象通过进程边界或网络边界的任何内容。网络边界示例:通过服务将业务层发布到web ui。进程边界示例:IIS应用程序/工作进程之间。您所说的“物理边界”是什么意思?对象通过进程边界或网络边界的任何内容。网络边界示例:通过服务将业务层发布到web ui。进程边界示例:IIS应用程序/工作进程之间。