Unity中的静态方法

时间:2009-10-27 06:49:34

标签: c# dependency-injection unity-container

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

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

示例(接近实际问题)

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

似乎很奇怪,我想我错过了一些东西,比如Container.Resolve(静态解析)。没有找到任何东西,但容器,统一或静态不是世界上最好的搜索术语。也许我应该尝试一下,但仍然感觉有点“奇怪”......

那么对静态方法中使用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));
    }

1 个答案:

答案 0 :(得分:1)

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

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

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

如果必须有静态方法,则应通过Method Injection传递依赖关系,但我认为重新考虑整体API设计通常更有利。通常,可以将所需功能建模为其中一个输入参数的成员。