如何在构造函数/参数注入之间进行选择?

时间:2011-12-14 14:29:12

标签: dependency-injection

我的问题有点含糊......

假设我有这个过程,当有新订单时将邮件发送到商店

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 个答案:

答案 0 :(得分:1)

允许IBookingMessageFactory返回特定于商店的BookingMessage看起来很好。看来你正在使用一个复合/装饰器IBookingMessageFactory,它将委托给一个特定于商店的实现,这很棒,因为这样可以保持简单。