Как выбрать конструктор / ввод параметров? - PullRequest
1 голос
/ 14 декабря 2011

Мой вопрос немного расплывчатый ...

Допустим, у меня есть этот процесс для отправки почты в магазин при появлении нового заказа

class BookingMessager : IBookingMessager{
  BookingMessager(IBookingDataSource source,IBookingMessageFactory messageFactory,IMessager messager){
    this.source = source;
    this.messageFactory= messageFactory;
    this.messager = messager;
  }
  void SendBookingMessage(int idBooking){
    Booking aBooking = source.GetById(idBooking);
    BookingMessage aMessage = messageFactory.Create(aBooking);
    messager.SendMessage(aBooking.Shop.Contact,aMessage.Title,aMessage.Content);
  }
}

Это хорошо работает.

Новое требование: я должен изменить свое тело сообщения в зависимости от магазина.

Я думаю об этих решениях: я создаю IBookingMessageFactory, который будет вызывать требуемый IBookingMessageFactory в зависимости от магазина, подобного этому

BookingMessage Create(Booking aBooking){
return this.BookingMessageFactoryIndex.ContainsKey(aBooking.Shop.ID) ? this.BookingMessageFactoryIndex[aBooking.Shop.ID].Create(aBooking) : this.default.Create(aBooking);
}

Или я добавляю IBookingMessageFactory в качестве параметра, но это заставит меня обновить мой интерфейс IBookingMessager: (

Какое лучшее решение? Мой первый код в порядке? Как выбрать между конструктором и внедрением параметра?

1 Ответ

1 голос
/ 15 декабря 2011

Разрешение IBookingMessageFactory вернуть специфичный для магазина BookingMessage выглядит нормально для меня. Кажется, вы используете составной / декоратор IBookingMessageFactory, который делегирует реализацию, специфичную для магазина, и это здорово, поскольку это упрощает задачу.

...