【问题标题】:IoC container for VBAVBA 的 IoC 容器
【发布时间】:2019-05-15 15:15:03
【问题描述】:

很好地阅读了 VBA 中的 DI:

https://rubberduckvba.wordpress.com/2016/07/05/oop-vba-pt-2-factories-and-cheap-hotels/

所以现在下一步是在 VBA 中使用 IoC 容器。但我想知道这是否可能!我是 VBA 新手,我不知道一些事情:

  1. 如果在 VBA 中完成,VBA 没有命名空间或 C# 中的等效类型。那么我的查找表如何存储一个类型的唯一键呢?
  2. 我想过用 C# 编写一个 com dll 并在那里实现一个 IoC,但我不知道如何将接口类型传递给 com 接口。我什至无法实例化一个接口以将其作为对象传递给 com。

我是不是只使用字符串并使用模块在 VBA 中实现命名空间?

PS:我没有找到任何用于 vba 的 IoC 容器的现有实现,所以如果有的话,我会全力以赴!

【问题讨论】:

  • 第一件事。解决相当于CreateObject("MyVBAClass")的问题,然后你就可以开始使用VBA IoC了。目前这是一个重要的问题。
  • 旁注,我喜欢看到 dependency-injection 标签和 SO 上的 vba 标签在同一帖子上。

标签: vba dependency-injection inversion-of-control ioc-container rubberduck


【解决方案1】:

这就是我们一直追求的圣杯:从 C# 代码在进程中实例化 VBA 类的能力。一旦我们弄清楚如何做到这一点,用于 VBA 代码的 IoC 容器就成为一种可能,并且绝对会与 Rubberduck 以及成熟的 mocking framework 一起提供。

VBA 解决方案可能是不可能的,因为正如@this 所暗示的,New在没有类型系统和没有反射的情况下动态创建一个类实例,...纯属黑魔法。

抛开技术问题不谈,人们不得不怀疑:IoC 容器会产生如此巨大的影响吗?

事实是,它不会。依赖注入 doesn't need an IoC container,“Poor Man's DI”工作得非常好,我可以补充一下,甚至更可取。

我认为,如果您已经达到了 IoC 容器对您的 VBA 项目有意义的程度,并且您了解有关 DI 和 SOLID 的所有内容并相应地编写您的代码......那么[不要从 VBA 中拿走任何东西,而是]我的评估是,您已经完全准备好从 VBA 继续前进并使用更多支持 OOP 的语言,例如 VB.NET 或 C# - 并使用您在 VBA 中学到的有关 OOP 的所有知识,同时发现一个全新的范围通过参数化构造函数、类继承、委托、lambdas、LINQ 和许多其他东西实现可能性。

【讨论】:

  • 我可能会补充说,这也可能是一个使用 C# COM DLL 来支持额外工作的场景,这将是向前迈进的好方法。我们不必放弃所有投资,而是使用 C# DLL 来支持在 .NET 环境中更容易完成的功能,同时提供当前应用程序所需的所有功能。有多种方法可以在不进行任何注册的情况下对 C# COM DLL 进行 xcopy 部署。
  • @this,自从我开始使用 VBA 以来,这也是我一直注意到的……你在 VBA 中做最少的事情并尽可能多地传递给 C#:P
  • 好吧! @Mathieu Guindon,我会按照你的建议去找那个穷人的 DI。 IoC 容器对我们来说确实有意义,但关键是,对我们来说,VBA 是在客户端。我们用 C++ 或 C# 做事。但是为客户提供接口 + IoC 以通过更改某些配置文件或类似的内容来切换事物是一个很酷的想法!
猜你喜欢
  • 2014-04-29
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多