- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我愿意:
这是一个小项目,我认为 DI 可能有点矫枉过正,但也许我错了?反正我一直关注ServiceLocator pattern as described by Martin Fowler
在客户端类的构造函数中,我有这样的东西:
this->db = Locator::getDb();
this->log = Locator::getLogger();
然后类的其余方法通过这些成员属性访问服务,例如:
this->fooModel = new fooModel(this->db);
fooItem1234 = this->fooModel->findById(1234);
但是我也希望“模型”对象(如上面的 fooModel)具有这种级别的可见性,因为它们可以从多个不同的地方访问,并且不需要有多个实例。
所以我最初的想法是扩展 Locator 使其具有 ::getFooModel()
但现在看来我违反了开放/封闭原则,因为我每次都必须修改 Locator我介绍了一个新的模型类。
为了满足 OCP,我可以使用 Dynamic Service Locator(也在 Fowler 的页面上进行了描述),但是出于与他相同的原因,我并不完全相信它,即它不够明确。
另一种解决方案是将所有模型的方法设为静态。所以:
fooItem1234 = FooModel::findById(1234);
我喜欢这个,因为它是零样板文件。我可以创建一个新的模型类,然后从任何地方开始用一行调用它。但是现在模型依赖于 Locator 来找到它的数据库连接,我不确定我对此有何看法。首先,如果我需要在单独的数据库连接上打开两个 fooModel,那将是一团糟和/或不可能。也就是说,我目前实际上不需要这样做,所以这个选项看起来有点诱人。
最后是 DI。但正如我上面所说,我认为这对于这个小项目来说可能太多了。
结论:我有点卡在这里,非常感谢 StackOverflow 专家的一些建议!
最佳答案
为什么您认为 DI 对您的项目来说太过分了? Constructor Injection 等 DI 模式比 Service Locator(我认为是反模式)更简单、更清晰。
我认为 Service Locator 是一种反模式,因为它对 API 的用户来说是完全不透明的,哪些依赖项需要到位;因此,您可以在服务定位器会抛出异常的上下文中轻松地调用您的对象的方法,而 API 绝对不会给您任何关于这种情况的线索。
您不需要 DI 容器来使用 DI。如果只有一个简单的项目,您可以使用所谓的 Poor Man's DI,您可以在其中手动连接依赖项。
关于php - ServiceLocator 和开放/封闭原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1899168/
从the documentation, 13.5.5: When the last parameter of a method is a closure, you can place the clos
Bjarne Stroustrup 写道: “友元类必须事先在封闭范围内声明或在非类范围内定义,立即封闭声明它为友元的类” 语句的第一部分不是多余的,因为“立即包含类的非类范围”包括“先前在封闭范围中
我有一个网格(如下例),其中包含外墙(标记为 W)、环境 block (E)、开放空间 (o) 和事件点 (A)。目前,此网格存储在 [,] 中,其中包含与给定点关联的所有数据。我试图确定是否包含一个
我正在尝试使用 this blogpost's approach to higher-kinded data without dangling Identity functors for the tr
在下面的代码中: package main import ( "fmt" "time" ) func asChan(vs ...int) <-chan int { c := m
我在传递和评估闭包列表时遇到困难。经过大量简化,该程序显示出与我正在尝试编写的程序相同的错误: use std::vec::flat_map; #[main] fn main() { let li
我正在努力成为一名好公民,并尽可能远离全局范围。有没有办法访问不在全局范围内的 setTimeout 变量? 因此,在此示例中,某人将如何取消“计时器”? myObject.timedAction =
考虑这个例子: def A(): b = 1 def B(): # I can access 'b' from here. print(b)
val listPlans: List = newPlans.mapTry { it.data.map { Plan(it.id, it.nam
我目前正在尝试使用SinonJS对我的 angular.service 进行单元测试,但是遇到了一个问题,希望有人可以阐明为什么会发生这种情况。我已经重构了当前的项目以说明当前的问题。 我还提供了DE
我正在使用 Go channel ,我想知道关闭 channel 和将其设置为 nil 之间有什么区别? 编辑: 在此example ,我想通过关闭 channel 或设置为零来断开发送者和接收者的连
我的应用程序有一个奇怪的行为,我不知道它来自哪里。我已经为 TextView 内容实现了 NSScanner,效果非常好。扫描器与文本存储结合使用,通过 TextView 委托(delegate)方法
我不知道如何让 MyBatis 生成封闭的 or 语句: WHERE x.token = ? AND ( (x.scene = 'A' OR x.scene = 'B')) 这是一个令人惊讶的简单
我不希望这是一个摄像头检测程序。这是一个程序,可以检测应用程序屏幕上颜色的传递。 我想要做的是检测大于 5x5 像素的黑色何时穿过屏幕上定义的空间区域。我想过用一个大区域来拉伸(stretch)整个宽
我一直在使用 RDFLib 来解析数据并将其插入到三元组中。我遇到的一个常见问题是,从关联数据存储库解析时,没有尖括号括起 URL。 要上传数据,我必须手动添加 并使用 URIRef重新创建 URL。
我已经阅读了很多有关此问题的帖子,但我仍然不确定我是否完全理解这些定义。 以下是我认为不同术语的示例。我是否走在正确的轨道上,或者我仍然不理解这些概念。谢谢 Array - unbound and o
我为我的 Android 应用设置了 GooglePlay 内部和封闭式 Alpha 测试设置。 它非常适合允许测试人员加入计划并安装应用程序,但是当我从测试人员电子邮件列表中删除测试人员时,他们仍然
我是一名优秀的程序员,十分优秀!