gpt4 book ai didi

oop - 依赖注入(inject)会增加我做傻事的风险吗?

转载 作者:行者123 更新时间:2023-12-01 13:07:26 25 4
gpt4 key购买 nike

我正在尝试接受广泛的依赖注入(inject)/IoC。随着我越来越多地了解这些好处,我当然可以欣赏它们,但是我担心在某些情况下,采用依赖注入(inject)模式可能会导致我以牺牲能够通过封装控制来限制风险为代价来创造灵 active 。系统能够做什么以及我或项目中的其他程序员能够犯什么错误。我怀疑我在模式中遗漏了一些可以解决我的问题的东西,希望有人能指出来。

这是我所关心的一个简化示例。假设我在 Notification 类上有一个 NotifyAdmins 方法,并且我使用此方法将非常敏感的信息分发给已在应用程序中定义为管理员的用户。信息可能会根据用户定义的设置通过传真、电子邮件、IM 等方式分发。此方法需要检索管理员列表。从历史上看,我会通过调用 AdminSet 类或调用 UserSet 类(请求一组用户对象是管理员)或什至通过直接调用数据库。然后,我可以调用方法 Notification.NotifyAdmins 而不必担心不小心将敏感信息发送给非管理员。

我相信依赖注入(inject)要求我将管理列表作为参数(以一种或另一种形式)。这确实有助于测试,但是,有什么可以防止我在调用代码和传入一组 NonAdmins 时犯下愚蠢的错误呢?如果我不注入(inject)设置,我只能在一两个固定的地方不小心把错误的人发邮件给错误的人。如果我确实注入(inject)了集合,我是否会在调用该方法并注入(inject)管理员集合的任何地方都犯这个错误?难道我做错了什么? IoC 框架中是否有允许您指定这些类型的约束但仍使用依赖注入(inject)的工具?

谢谢。

最佳答案

你需要扭转你的想法。

如果您有一个服务/类应该只将私有(private)信息邮寄给管理员,而不是将管理员列表传递给该服务,而是传递另一个服务,该类可以从中检索管理员列表。

是的,你仍然有可能出错,但是这段代码:

AdminProvider provider = new AdminProvider();
Notification notify = new Notification(provider);
notify.Execute();

比这更难出错:

String[] admins = new String[] { "joenormal@hotmail.com" };
Notification notify = new Notification(admins);
notify.Execute();

在第一种情况下,所涉及的方法和类将以易于发现错误的方式明确命名。

在您的 Execute 方法内部,代码可能如下所示:

List<String> admins = _AdminProvider.GetAdmins();
...

如果出于某种原因,代码如下所示:

List<String> admins = _AdminProvider.GetAllUserEmails();

那你就有问题了,但应该很容易发现。

关于oop - 依赖注入(inject)会增加我做傻事的风险吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com