- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
刚刚完成 AngularJS 类(class),到处都在使用依赖注入(inject)这个术语。我说得对吗?它的要点是:将依赖对象传递给目标函数(或构造函数)而不是在目标内部创建它们?
我得到了它的好处,易于单元测试等。但我一直在其他领域这样做,主要是 c++ 和 googlemock,不知道有一个术语依赖注入(inject)。那我错过了什么吗?我想 Angular 的 DI 必须管理这些服务和工厂的生命周期,并将它们传递给请求对象,但这应该是实现细节而不是依赖注入(inject)概念的一部分?
最佳答案
“依赖注入(inject)”并没有什么特别神奇的地方,但它是保持责任隔离和依赖灵活的有用模型。改进的可测试性是一个令人愉快的副作用,但依赖注入(inject)的核心只是局部和单一职责原则的特定体现。
这是一个典型的 C++ 示例。首先,考虑类 Foo
是如何有机增长的:
class Foo
{
public:
Foo(A a, B b, C c)
: a_(a), widget_(b, c) {}
private:
A a_;
Widget widget_;
};
Foo
的功能可能需要一些Widget
类型的内部对象。但请注意 widget_
对象的构造(以及潜在的失败!)是如何由 Foo
的构造函数负责的。我们不仅需要通过 Foo
传递所有需要的参数,相反,Foo
还需要处理 Widget
的所有潜在故障模式> 构造函数。最重要的是,我们只能使用单一版本的 Widget
(并且我们需要在 Foo< 中传递所有
翻译单元)。Widget
的定义
进入依赖注入(inject):
struct AbstractWidget { ~AbstractWidget() = default; };
class Foo
{
public:
Foo(A a, std::unique_ptr<AbstractWidget> widget)
: a_(a), widget_(std::move(widget)) {}
private:
A a_;
std::unique_ptr<AbstractWidget> widget_;
};
现在 Foo
对抽象“小部件”功能的依赖性被构造函数注入(inject)到 Foo
对象中。小部件对象已经完全构建并以我们不再关心的方式运行。 Foo
现在只做一件事。一个流行的助记符是“依赖于抽象,而不是具体化”。
乍一看,这就是它的全部内容。
某些语言(例如 Java,可能还有 JavaScript)中的依赖注入(inject)是众所周知的,并且在这些语言中的教学更为突出,因为存在强大的框架来自动构建使用 DI 的设计。这种自动化可能包括相关构造函数的自动定义,并且它们可能使“注入(inject)”点远离构造的实例,这使得运行程序中的最终有效依赖性比人们预期的动态得多一个典型的 C++ 程序。
关于c++ - 依赖注入(inject)的要点是将依赖传递给目标函数(或构造函数)而不是在目标内部创建它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580031/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!