问题标签 [decorator-chaining]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 使用依赖注入的存储库和专用存储库的装饰器链接
现在,我正试图找出一种更聪明地做事的方法,在此过程中,我设法做的就是在一天内使用一整瓶 excedrin。
假设我有一个像这样的名为 IRepository 的接口。
并假设我有一个像
现在,一切都很好,我可以对存储库执行所有基本操作以支持所有 CRUD 功能,但我可能需要专门的操作,所以假设我有一个这样的界面:
和这样的实现:
好的,这就是基本设置,现在我还想做一件事。我想要透明地进行日志记录和事务以及类似的事情。所以我想做的是使用像 Castle Windsor 或 StructureMap 这样的依赖注入框架,这样当我请求 IRepository 时,我会用 LoggingRepository 和 TransactionRepository 包装它,这两个都实现了 IRepository。
所以,我想做的是这样的:
并让它返回一个包含在 Logging 和 Transaction 装饰器中的用户存储库,但我想不出一种可行的方法。我能想到让它工作的唯一方法是像这样实现 UserRepository:
这意味着我们将使用依赖注入来创建一个修饰的存储库并将其传递给 UserRepository 的构造函数,然后将其用作我们对其运行操作的存储库。这会起作用,但我仍然认为它不是理想的。
所以,我的问题是,我是对的,这是做到这一点的唯一方法,还是我没有正确理解这一点,或者只是错过了一些东西。另外,如果你以前遇到过这个问题,你是如何解决这个问题的?
design-patterns - 在装饰器模式中调用装饰器(在方法的开头或结尾)是否重要?
我正在用 Javascript 实现装饰器模式。
我在维基百科中看到了这个例子
现在我的问题是该模式仍然是装饰器模式,在 cost() 函数的开头或结尾调用父类是否重要?
现在,我意识到这取决于每个装饰器的作用......例如,如果你在装饰器中进行乘法或除法而不是加法或减法,它当然会保证不同的结果。
但是除了我在上一段中所说的原因之外,还有什么理由在之前或之后拨打电话吗?
python - 带参数的 Python 2.6 装饰器
我正在为 django 编写文件系统缓存装饰器。问题是当我用这个装饰器和@register.simple_tag 装饰我的函数时,我得到 my_decorated_func 需要 0 个参数错误(当页面加载了这个模板标签时)
从控制台调用带有参数的 my_decorated_func 是可以的,但是渲染一个模板:
给我一个错误。
有什么建议么 ?谢谢 !
python - 如何确保在 Python 中应用函数装饰器的顺序?
一些装饰器应该只用在最外层。
增强原始功能并添加配置参数的装饰器就是一个示例。
我怎样才能避免像这样的装饰器被另一个装饰器装饰?
编辑
让每个尝试应用新装饰器的人都担心应用顺序,真是令人作呕。
那么,有没有可能避免这种情况呢?是否可以在不引入新参数的情况下添加配置选项?
castle-windsor - 在温莎城堡中为类型化实现注册开放的通用装饰器
在试图强迫 Windsor 用随机数量的装饰器包装实现时,我偶然发现了以下内容:
我有 3 个装饰器和一个实现,它们都使用相同的接口。
如果您运行此代码,windsor 将解析icommandhandler<stringcommand>
为implementation
,据我所知,这是预期的行为,因为类型化实现无法使用开放类型化装饰器注册。
但是,如果您取消注释该行container.Register(Component.For<ICommandHandler<stringCommand>>().ImplementedBy<Decorator1<stringCommand>>());
,所有三个装饰器都将用于解析implementation
,这是所需的结果(类似于 : )。
为什么会发生这种情况,这是我不知道的温莎特色吗?是否有不同的方法可以达到相同的效果?(不诉诸反思)
php - php中装饰器的完整继承行为
我一般不太习惯设计模式,也从未使用过装饰器。我想要一个可以根据上下文具有不同行为的对象。这些行为在不同的类中定义。我猜装饰器可以解决问题。但我需要每个装饰器都可以访问相同的属性,并首先调用子方法,就像继承一样。所以在这里我做了什么:
现在我们可以根据上下文“构造”“继承”了:
并以行为抽象运行对象:
它做我想要的,但是:
- 不再有封装
- $this->parent 很丑
- $this->这很难看
你怎么看?
- 如何以另一种方式访问装饰器(“儿童”)方法
- 我如何共享属性,例如它们是否在继承的上下文中受到保护
- 装饰器的使用不当吗?
- 有没有更优雅的模式可以解决问题
- parent 和这个属性是一种重新发明轮子,不是吗?
一个真实的例子:咖啡机
python - Python函数在装饰后失去身份
(Python 3)首先,我觉得我的标题不是应该的,所以如果你坚持这个问题并想出一个更好的标题,请随时编辑它。
我最近学习了 Python 装饰器和 Python 注释,所以我写了两个小函数来测试我最近学到的东西。其中一个,被调用wraps
应该模仿 的行为functools wraps
,而另一个,被调用ensure_types
应该检查给定函数并通过它的注释,如果传递给某个函数的参数是正确的。这是我为这些功能提供的代码:
据说,到目前为止一切都很好。thewraps
和 theensure_types
都应该用作装饰器。当我定义第三个装饰器时问题就来了,debug_dec
它应该在调用函数及其参数时打印到控制台。功能:
这也很酷。当我尝试同时使用时,问题就来debug_dec
了ensure_types
。
但是,如果我更改调用装饰器的顺序,它就可以正常工作。有人可以帮我理解出了什么问题,除了交换这两行之外是否有任何解决问题的方法?
编辑 如果我添加以下行:
输出如下:
javascript - 链接具有副作用的成员变量,链不以函数结尾
在 JavaScript chaijs测试库中,可以像这样链接成员:
这个问题不是关于测试库,而是关于库的内部技术。我知道它的工作原理是这样的:pm.expect
是一个返回一个对象的函数,该对象至少包含{ to: { be: { a } } }
wherea
另一个函数至少返回{ that: { is: { not: { empty } } } }
.
有趣的是,这empty
显然不是一个函数。如果是这样,我将不得不这样称呼它:(that.is.not.empty()
注意括号)。所以链以一个不是函数的成员变量结束。
在 JavaScript 中如何使用该成员变量来产生副作用?你能给我看一个最小的 JS 片段,它允许我用不是函数调用的东西(比如empty;
)结束一个表达式,并且仍然像一个函数调用一样工作吗?
python-3.x - 在装饰器链接中,我们传递给装饰器的函数是否被执行了两次?
现在我怀疑增量函数是否被执行了两次?当我们将它传递给两个装饰器时。
unit-testing - 使用参数化模块链接装饰器
我正在为特定问题寻求帮助。我们正在编写测试套件,其中一个测试用例包含一个包含函数的类。这个函数是我们的测试用例。测试用例由 htmltestrunner 执行。如果某些测试用例针对不同的参数测试类似的行为,我们会在模块 parameterezy 的帮助下参数化这个测试用例 - 指定:使用 parameterize.expand 这是一个包装器。现在,为了进行更有效的日志记录,我们想在一个名为扩展日志记录的单独模块中编写一个函数。这应该作为 PARAMETERIZED 函数的包装器。
这意味着:参数化 -> WRAPS -> 高级日志记录 -> WRAPS -> 测试用例函数
不,我为我的高级日志功能编写了以下代码(仅用于调试和测试):
当我不使用参数化包装器来参数化我的测试用例时,该函数起作用。如果我使用参数化包装器,我会失败:'NoneType' 对象不可调用。
任何人都可以帮助我吗?一整天都在找。
编辑:我已经发现,parameterized.expand 返回“NoneType Object”。有没有办法从 parameterized.expand 中获取装饰函数作为返回?