Dependency injection 编译时的依赖注入

Dependency injection 编译时的依赖注入,dependency-injection,Dependency Injection,为什么所有DI框架在应用程序启动之前都会在运行时检查所有依赖关系?为什么不在编译时检查它,这有什么好处 是否可以更改已部署应用程序中的依赖关系? 例如,当应用程序启动时,它通过电子邮件发送通知,但之后我们可以更改为通过sms发送而不停止应用程序吗?DI容器按定义使用反射工作,这意味着运行时元数据。如果希望在编译时检查所有内容,则不应使用DI容器,而应手动连接依赖项。手工应用DI是一种常见的做法,称为 但之后,我们可以改变发送短信而不停止应用程序吗 您似乎要求应用程序在保持运行的同时响应配置更改。

为什么所有DI框架在应用程序启动之前都会在运行时检查所有依赖关系?为什么不在编译时检查它,这有什么好处

是否可以更改已部署应用程序中的依赖关系?
例如,当应用程序启动时,它通过电子邮件发送通知,但之后我们可以更改为通过sms发送而不停止应用程序吗?

DI容器按定义使用反射工作,这意味着运行时元数据。如果希望在编译时检查所有内容,则不应使用DI容器,而应手动连接依赖项。手工应用DI是一种常见的做法,称为

但之后,我们可以改变发送短信而不停止应用程序吗

您似乎要求应用程序在保持运行的同时响应配置更改。有一些常见的模式允许您实现这一点。通常,您希望定义该应用程序的组件对象图(包含行为及其依赖项的类链)一次。尽管您可能会根据请求创建这样的图,但该图的形状不应在以后更改。相反,您可以使用诸如和之类的模式。例如,考虑以下接口和实现:

接口INotificationSender
{
无效发送(字符串消息);
}
类MailNotificationSender:INotificationSender{…}
类SmsNotificationSender:INotificationSender{…}
我们可以如下定义代理:

类ConfigBasedNotificationSenderProxy:INotificationSender
{
私人只读INotificationSender邮件;
私人只读INotificationSender短信;
公共配置基础通知SenderProxy(
INotificationSender邮件、INotificationSender短信)
{
this.mail=邮件;
这个.sms=sms;
}
公共无效发送(字符串消息)
{
bool sendthoghmail=ReadFromConfgWhereToSendTo();
var sender=sendThroughMail?this.mail:this.sms;
发送者。发送(消息);
}
}
您可以在应用程序启动时构建以下对象图:

var sender=新的ConfigBasedNotificationSenderProxy(
新邮件通知发件人(…)
新SmsNotificationSender(…);
您也可以使用DI容器来连接它,或者手动(纯DI)来完成

然而,我想在这里指出的重要一点是,即使您需要更改应用程序在运行时的行为方式,也不需要重新布线应用程序。您应该能够通过使用代理实现更改通过应用程序对象图的调用图

这与仅在启动时更改配置的功能不同。在这种情况下,对象图的组成可以如下所示:

var config=ReadConfigurationFile();
INotificationSender=config[“mail”]=“true”
? 新邮件通知发件人(…)
? 新SmsNotificationSender(…);
var consumer=新的SomeConsumer(发送方);

在这种情况下,不需要
ConfigBasedNotificationSenderProxy
,因为在应用程序运行时只会使用一个实现。更改通知的发送方式意味着更改配置文件并重新启动应用程序。

您似乎错过了使用DI框架的要点。。。若你们在编译时这样做,那个么你们只是硬连接你们的依赖关系,这不是DI…好的,所以你们可以在已经部署的应用程序中改变依赖关系?这是一点是的。它还允许您根据只有在运行时才知道的其他信息有条件地注册不同的实现。。。它还使维护变得更加困难…好的,您可以在不停止应用程序的情况下切换依赖项。您正在使用哪个DI库?您能否提供一个链接,指向如何在不停止该库中的应用程序的情况下切换依赖关系的示例?谢谢。@Milney我想你也没领会DI的意思。DI是一组模式和原则,它根本不需要框架。您可以通过将依赖项连接到一个。更新了有关在运行时更改应用程序行为的信息。通过定义,“DI容器通过使用反射来工作,这意味着运行时元数据”Dagger和Micronaut之类的人想要一个词。