Где определить сервис enum в C #? - PullRequest
2 голосов
/ 06 февраля 2012

Допустим, у меня есть интерфейс ICustomerService, и для этого интерфейса требуется перечисление, например ProcessingMode:

namespace MyServices {
    public enum ProcessingMode { Immediate, Normal, Slow }

    public interface ICustomerService {
        void Process(ProcessingMode mode);
    }
}

Перечисление не может быть определено внутри интерфейса в C # (но, по-видимому, в VB?).Но наличие этого вне интерфейса загромождает содержащееся пространство имен MyServices.Не хорошо, так как для других интерфейсов может также потребоваться другое перечисление с именем ProcessingMode.

Так есть ли "лучшие практики", как решить эту проблему?

Могу ли яя вижу несколько вариантов, но ни один из них не кажется мне совершенно правильным:

  1. Поместите и интерфейс, и перечисление в пространство имен для конкретной службы:

    namespace MyServices.CustomerService {
        public enum ProcessingMode { Immediate, Normal, Slow }
    
        public interface ICustomerService {
            void Process(ProcessingMode mode);
        }
    }
    

    Хотя он работает и избегает беспорядка в содержащем пространстве имен, он вызывает увеличение пространства имен, и я предполагаю, что реализация службы может конфликтовать с пространством имен или дублировать его: MyNamespace.CustomerService.CustomerService.Или куда бы вы поместили реализацию сервиса и как бы вы ее назвали?

  2. Поместите только перечисление в отдельное пространство имен (или статический класс):

    namespace MyServices {
        namespace CustomerServiceTypes {
            public enum ProcessingMode { Immediate, Normal, Slow }
        }
    
        public interface ICustomerService {
            void Process(CustomerServiceTypes.ProcessingMode mode);
        }
    }
    

    Те же проблемы, что и в варианте 1, но также требует, чтобы имя перечисления было квалифицировано «везде».

  3. Префикс имени перечисления, например, CustomerServiceProcessingMode.Предотвращает распространение пространства имен и риск столкновения имен с реализациями служб, но вызывает длинные уродливые имена перечислений.

Так как бы вы это сделали?

Ответы [ 4 ]

3 голосов
/ 06 февраля 2012

Просто поместите интерфейс и перечислите в одном пространстве имен.В любом случае вам придется сделать enum public, потому что вы используете его внутри сервиса.Таким образом, поместив interface и enum в одно пространство имен, реализатор интерфейса может включать только одно пространство имен.

Как и System.Drawing, имеет Color enum.

2 голосов
/ 06 февраля 2012

То, что обработка обрабатывается службой поддержки клиентов, не означает, что вы должны назвать enum "CustomerService ....." - если перечисление предназначено для Customer, просто назовите его CustomerProcessingMode; особенно если enum будет принадлежать бизнес-классу.

Если будет много способов обработки клиента, для которых потребуются разные режимы обработки, вам придется вместо этого использовать название службы, но причина, по которой вам не нравится внешний вид имени, заключается в том, что имя вашей службы это мусор :) "CustomerService" - что это делает?

MailingService (который запускается на реализациях интерфейса) будет хорошим примером для службы, потому что ее имя говорит вам о том, что делает служба, а не о том, над чем она работает. Даже «CustomerRepository» - хорошее имя, потому что оно говорит вам, что оно делает.

  1. Используйте пространство имен MyModel.Services
  2. Используйте название для вашего сервиса, которое объясняет, что он делает, а не то, на чем он работает
  3. Затем вы получите хорошее описательное (и уникальное) имя перечисления, например, «MailingPriority»

Служба именования "CustomerService" не имеет никаких указаний о задаче службы и, как правило, в конечном итоге выполняет все, что угодно, что касается клиентов - своего рода услуга "Швейцарский армейский нож", которая должна действительно иметь одну целевую задачу, а не быть каталогом всего, что можно сделать с клиентом.

1 голос
/ 06 февраля 2012

Я бы, вероятно, использовал бы комбинацию из двух:

  • Поместите и интерфейс, и перечисление в пространство имен для конкретной службы.
  • Укажите более конкретное имя для перечисления (еслиуместно).

Меня не очень беспокоит конфликт имен, ваше имя перечисления является частью вашего контракта на обслуживание, так же как и имя интерфейса.Вы действительно не беспокоитесь о том, что кто-то определяет тот же интерфейс в том же пространстве имен?То же самое для enum и других открытых типов, которые являются частью контракта.

0 голосов
/ 06 февраля 2012

Я бы выбрал № 3.Имена должны быть описательными и на первый взгляд показывать, для чего они нужны.Длина имени не является критерием для меня.Мне было бы гораздо более раздражающим иметь несколько ProcessingMode перечислений с разными значениями.

Просто мои 2 цента ...

...