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

Dependency injection 如何在构造函数/参数注入之间进行选择?,dependency-injection,Dependency Injection,我的问题有点模糊 假设我有这样一个流程,当有新订单时,我可以向商店发送邮件 class BookingMessager : IBookingMessager{ BookingMessager(IBookingDataSource source,IBookingMessageFactory messageFactory,IMessager messager){ this.source = source; this.messageFactory= messageFactory;

我的问题有点模糊

假设我有这样一个流程,当有新订单时,我可以向商店发送邮件

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:(


最好的解决方案是什么?我的第一个代码可以吗?我如何在构造函数和参数注入之间进行选择?

IBookingMessageFactory
返回特定于商店的
BookingMessage
对我来说很好。你似乎在使用一个复合/装饰器
IBookingMessageFactory
,它将委托给一个商店特定的实现,这很好,因为这样可以使事情简单。

IBookingMessageFactory
返回特定于商店的
BookingMessage
在我看来很好。您似乎正在使用复合/装饰器
IBookingMessageFactory
,它将委托给特定于商店的实现,这很好,since这让事情变得简单。

@JesseC.Slicer你不能这么做,拜托!!@JesseC.Slicer你不能这么做,拜托!!是的,但有了这个解决方案,我会得到一些意大利宽面条代码不?意大利宽面条有层次,所以这是好的。意大利宽面条不好:-)。问题是什么?如果你是说使用decorators是lagasgna(分层的),那么你是对的。它提出了抽象概念,但我的经验是,这可以很好地调试。从一个类跳到另一个类有点困难(F12,假设您使用.NET和Visual Studio),因为在编码时使用哪些类不太清楚,但在调试过程中这会变得清晰。另一方面,这为应用程序增加了很多灵活性,并允许您在不更改代码的情况下添加功能()。您说得对,谢谢!SOLID的问题是,你总是像填充层太多或不够一样填充。@Remi:俗话说,软件中没有一个问题不能通过添加另一层抽象来解决,当然是有太多抽象层的问题:-)是的,但是有了这个解决方案,最后我会做一些意大利宽面条代码不?意大利宽面条有层次,所以这很好。斯帕盖特很糟糕:-)。问题是什么?如果你是说使用decorators是lagasgna(分层的),那么你是对的。它提出了抽象概念,但我的经验是,这可以很好地调试。从一个类跳到另一个类有点困难(F12,假设您使用.NET和Visual Studio),因为在编码时使用哪些类不太清楚,但在调试过程中这会变得清晰。另一方面,这为应用程序增加了很多灵活性,并允许您在不更改代码的情况下添加功能()。您说得对,谢谢!SOLID的问题是,你总是填充得太多或者不够。@Remi:俗话说,软件中没有一个问题不能通过添加另一个抽象层来解决,当然是抽象层太多的问题:-)