Единство в статических методах - PullRequest
2 голосов
/ 27 октября 2009

возможно простая проблема, но странно, почему я понятия не имею, как это сделать:

Unity (PRISM) и статические методы. В этом особом случае метод расширения. Но в целом, как мне получить доступ к «единственному экземпляру» в статическом методе. Подумайте, например, службы ведения журналов Я хочу получить доступ к журналу некоторые вещи, которые я делаю внутри статического метода. Действительно ли я должен передать ссылку в службу регистрации при ее использовании?

Пример (близко к реальной проблеме)

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

Кажется странным, я думаю, что мне чего-то не хватает, например Container.Resolve (статическое разрешение). Ничего не нашли, но контейнер, единство или статичность - не лучшие поисковые термины в мире. Возможно, я должен просто попробовать это, но все же, это выглядит как-то "странно" ..

Итак, есть ли комментарии по поводу того, КАК и ЕСЛИ использовать DI в статических методах?

Chris

РЕДАКТИРОВАТЬ - хорошо, текущий подход после ответа: 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 Ответ

1 голос
/ 27 октября 2009

Статические типы и члены, как правило, являются врагами всех вещей DI.

Технически, у вас может быть статический метод Resolve, но это будет не DI, а скорее шаблон, известный как Service Locator. Однако многие люди (включая меня) считают Service Locator антишаблоном по нескольким причинам:

  • Это делает неявные предположения о требованиях использования API (вызывающий не знает, что локатор службы должен быть правильно настроен, прежде чем член может быть вызван)
  • становится невозможным вложение контейнеров
  • Введена избыточная зависимость от самого локатора служб

Если у вас должен быть статический метод, вы должны передать зависимость через метод Injection, но я думаю, что часто бывает выгоднее пересмотреть общий дизайн API. Часто желаемая функциональность может быть смоделирована как член одного из входных параметров.

...