возможно простая проблема, но странно, почему я понятия не имею, как это сделать:
Единство (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));
}
Статические типы и члены обычно являются врагом всех вещей DI.
Технически вы можете иметь статический метод Resolve, но это не будет DI, а скорее шаблон, известный как Service Locator. Однако многие люди (включая меня) считают Service Locator анти-шаблоном по нескольким причинам:
Если у вас должен быть статический метод, вы должны передать зависимость через метод Injection, но я думаю, что часто более полезно пересмотреть общий дизайн API. Часто желаемая функциональность может быть смоделирована как член на одном из входных параметров.