在C#中在何处定义特定于服务的枚举?

在C#中在何处定义特定于服务的枚举?,c#,interface,enums,namespaces,C#,Interface,Enums,Namespaces,假设我有一个接口ICCustomerService,这个接口需要一个枚举,例如ProcessingMode: 枚举不能在C#中的接口内定义(但显然是在VB中)。但是,将其置于接口之外会使包含名称空间MyServices变得混乱。不太好,因为其他接口可能也需要名为ProcessingMode的不同枚举 那么,有什么“最佳实践”可以解决这个问题吗 我可以看到一些选择,但在我看来没有一个是正确的: 将接口和枚举放在特定于服务的命名空间中: 虽然它可以工作并避免包含名称空间中的混乱,但它确实会导致名

假设我有一个接口
ICCustomerService
,这个接口需要一个枚举,例如
ProcessingMode

枚举不能在C#中的接口内定义(但显然是在VB中)。但是,将其置于接口之外会使包含名称空间
MyServices
变得混乱。不太好,因为其他接口可能也需要名为
ProcessingMode
的不同枚举

那么,有什么“最佳实践”可以解决这个问题吗

我可以看到一些选择,但在我看来没有一个是正确的:

  • 将接口和枚举放在特定于服务的命名空间中:

    虽然它可以工作并避免包含名称空间中的混乱,但它确实会导致名称空间的扩展,我猜服务实现可能会与名称空间冲突或复制它:
    MyNamespace.CustomerService.CustomerService
    。或者,您将把服务实现放在哪里?您将如何称呼它

  • 仅将枚举放在单独的命名空间(或静态类)中:

    与选项1相同的问题,但也要求枚举名必须限定为“无处不在”

  • 在枚举名称前加前缀,例如
    CustomerServiceProcessingMode
    。避免名称空间扩散和名称与服务实现冲突的风险,但会导致长而难看的枚举名称

  • 那么你会怎么做呢?

    我会选择#3。名字应该是描述性的,第一眼就能看出它们的用途。名字的长度对我来说不是标准。我会发现有多个不同含义的
    ProcessingMode
    enum更令人恼火


    就我的2分…

    我可能会结合使用以下两种:

    • 将接口和枚举都放在特定于服务的命名空间中
    • 为枚举指定更具体的名称(如果适用)

    我不会太担心名称冲突,您的enum名称是服务合同的一部分,就像接口名称一样。你不会真的担心有人在同一个命名空间中定义同一个接口,是吗?enum和其他公共类型也是合同的一部分。

    只需将接口和enum放在一个命名空间下即可。在任何情况下,您都必须将
    枚举
    公开
    ,因为您在服务内部使用它。因此,通过将接口和枚举放在一个名称空间下,使接口的实现者只包含一个名称空间


    就像
    System.Drawing
    Color
    enum.

    仅仅因为是客户服务进行处理并不意味着您必须将enum命名为“CustomerService…”-如果enum是针对客户的,则只需将其称为CustomerProcessingMode;尤其是当枚举将成为业务类上的属性时

    如果有许多处理客户的方法需要不同的处理模式,那么您将不得不使用服务名称,但您不喜欢名称外观的原因是因为您的服务名称是垃圾:)“CustomerService”-这到底是做什么的

    MailingService(在接口的实现者上运行)将是一个很好的服务示例,因为名称告诉您服务的功能,而不是它的工作原理。甚至“CustomerRepository”也是个好名字,因为这个名字告诉你它的功能

  • 使用名称空间MyModel.Services
  • 为您的服务使用一个名称,说明它的作用,而不是它的工作原理
  • 然后,您会得到一个很好的描述性(并且是唯一的)枚举名称,比如“MailingPriority”

  • 将服务命名为“CustomerService”并不表示服务的任务,通常最终执行与客户有关的任何事情——有点像“瑞士军刀”服务应该真正有一个单一的重点任务,而不是一个目录,一个人可以做的一切与客户。

    我不清楚你在这里试图解决什么问题。为什么您认为在主命名空间中公开枚举是一个问题?@Oded:枚举的名称可以在接口的命名范围(命名空间)内(例如CustomerService.ProcessingMode)变得简短和不同,但在接口之外,在mor通用命名空间中,可能有几十个服务接口驻留,枚举名称必须更长更精确,本质上重复服务名称,例如CustomerProcessingMode。是的,很好,但是假设你有150多个服务接口,如果你为每个服务创建一个新的名称空间,你会得到相当多的名称空间。我并不认为会有任何问题。性能、二进制文件的大小或任何东西,但它似乎太多了…@KjellRilbe:如果你使用的是150+服务接口,那么我的朋友,你要么是坐在金矿上(如此庞大的项目,巨额资金),可以承受得起混乱,要么是架构中存在严重问题。:)其次,服务的分离是非常明确的,从逻辑上讲,你不应该在一个服务和另一个服务之间使用合同。@@Amar:是的,对,我没有150个服务。但我可以看到,我正在使用的系统中可能会有很多服务。我想无论我采用哪种方式,枚举都必须“以某种方式”进行限定,为枚举和服务接口提供一个公共名称空间可能是最好的方法。不过,我确实希望C#能够支持接口中的成员类型。我认为这是合理的,类型是接口合同的一部分。好主意。我写的名字只是个例子,我没有想到你在这里提到的方面。真实案例(在瑞典语和更复杂的语言中)有更好的名称。我仍然觉得,当枚举与接口约定紧密耦合时,能够在服务接口内定义枚举会很好。@KjellRilbe-但是你不能这样做,那么你打算怎么做?:)
    namespace MyServices {
        public enum ProcessingMode { Immediate, Normal, Slow }
    
        public interface ICustomerService {
            void Process(ProcessingMode mode);
        }
    }
    
    namespace MyServices.CustomerService {
        public enum ProcessingMode { Immediate, Normal, Slow }
    
        public interface ICustomerService {
            void Process(ProcessingMode mode);
        }
    }
    
    namespace MyServices {
        namespace CustomerServiceTypes {
            public enum ProcessingMode { Immediate, Normal, Slow }
        }
    
        public interface ICustomerService {
            void Process(CustomerServiceTypes.ProcessingMode mode);
        }
    }