Единство в статических методах

2

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

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

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

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

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

Итак, любые комментарии к HOW и IF использовать DI в статических методах?

Крис

EDIT - ok, текущий подход после ответа: 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));
    }
Теги:
dependency-injection
unity-container

1 ответ

1
Лучший ответ

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

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

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

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

  • 0
    Хорошо, я думаю, что я постараюсь предоставить контейнер. Я редактирую пост, возможно, посмотрите и скажите мне, что вы думаете. Спасибо, Крис ...
  • 0
    Мне больше понравилось ваше оригинальное предложение (то есть введение ILogger). Это более четко разграничивает ответственность метода и предотвращает «загрязнение ответственности», а также сохраняет независимость метода DI Container.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню