gpt4 book ai didi

c# - 静态方法中的统一

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:26 24 4
gpt4 key购买 nike

一个可能很简单的问题,但奇怪的是我不知道该怎么做:

Unity (PRISM) 和静态方法。在这种特殊情况下,扩展方法。但总的来说,我如何在静态方法中访问“统一提供的实例”。想想例如我想要访问的日志记录服务的一部分,以记录我在静态方法中所做的一些事情。使用时我真的必须将 ref 传递给日志记录服务吗?

例子(接近实际问题)

public static void HookupPrismEvent(ref UIElement, ILogger log) {...}

看起来很奇怪,我想我遗漏了一些东西,比如 Container.Resolve(静态解析)。还没有找到任何东西,但是 container、unity 或 static 都不是世界上最好的搜索词。也许我应该尝试一下,但仍然感觉有点“奇怪”..

那么关于在静态方法中使用 DI 的 HOW 和 IF 有什么意见吗?

克里斯

编辑 - 好的,回答后的当前方法:EDIT2,在考虑之后,删除了容器,提供了“需要的东西”......

  public static void AttachPrismEvents(this UIElement element, IEventAggregator eA)
{
var ev = eA.GetEvent<KeyPressedEvent>();
element.KeyDown += ((sender, e) => ev.Publish(e));
}

或者,使用日志记录:

  public static void AttachPrismEvents(this UIElement element, ILogger log, IEventAggregator eA)
{
log.Debug("Doing stuff");
var ev = eA.GetEvent<KeyPressedEvent>();
element.KeyDown += ((sender, e) => ev.Publish(e));
}

最佳答案

静态类型和成员通常是所有 DI 的敌人。

从技术上讲,您可以使用静态 Resolve 方法,但这不是 DI,而是一种称为服务定位器的模式。然而,许多人(包括我自己)认为服务定位器是一种反模式,原因如下:

  • 它对 API 的使用要求做出隐含的假设(调用者不知道在调用成员之前必须正确配置服务定位器)
  • 嵌套容器变得不可能
  • 它引入了对服务定位器本身的冗余依赖

如果你必须有一个静态方法,你应该通过方法注入(inject)来传递依赖关系,但我认为重新考虑整体 API 设计通常更有益。通常,可以将所需功能建模为输入参数之一的成员。

关于c# - 静态方法中的统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1629097/

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