在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
。或者,您将把服务实现放在哪里?您将如何称呼它CustomerServiceProcessingMode
。避免名称空间扩散和名称与服务实现冲突的风险,但会导致长而难看的枚举名称ProcessingMode
enum更令人恼火
就我的2分…我可能会结合使用以下两种:
- 将接口和枚举都放在特定于服务的命名空间中
- 为枚举指定更具体的名称(如果适用)
我不会太担心名称冲突,您的enum名称是服务合同的一部分,就像接口名称一样。你不会真的担心有人在同一个命名空间中定义同一个接口,是吗?enum和其他公共类型也是合同的一部分。只需将接口和enum放在一个命名空间下即可。在任何情况下,您都必须将
枚举
公开
,因为您在服务内部使用它。因此,通过将接口和枚举放在一个名称空间下,使接口的实现者只包含一个名称空间
就像
System.Drawing
有Color
enum.仅仅因为是客户服务进行处理并不意味着您必须将enum命名为“CustomerService…”-如果enum是针对客户的,则只需将其称为CustomerProcessingMode;尤其是当枚举将成为业务类上的属性时
如果有许多处理客户的方法需要不同的处理模式,那么您将不得不使用服务名称,但您不喜欢名称外观的原因是因为您的服务名称是垃圾:)“CustomerService”-这到底是做什么的
MailingService(在接口的实现者上运行)将是一个很好的服务示例,因为名称告诉您服务的功能,而不是它的工作原理。甚至“CustomerRepository”也是个好名字,因为这个名字告诉你它的功能
将服务命名为“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);
}
}