2016-12-27 3 views
1

Мне пришлось взять гигантский монолит с несколькими слоями, услугами и компонентами.Ошибка проектирования, злоупотребление MDC

Пока я шел по коду, первое, что я понимаю, это использование MDC.

Некоторые примеры:

public void setContextOrderId(String orderId) { 
    MDC.put("orderId", orderId); 
} 

или

String sessionId = MDC.get("sessionId"); 

MDC используется в качестве статического HashMap через приложение, я считаю, мотив был обусловлен тем, что MDC предоставляется по запросу поперек запросить конвейер, и он использовался в качестве хранилища.

Как его заменить? Есть ли альтернатива для контейнера с защитой от резьбы?

Спасибо.

ответ

1

Oh my. Кто-то использовал MDC для хранения данных. «Злоупотребление» - правильный термин здесь.

Правильное решение зависит от того, что именно используется. Например, если вы запускаете что-то вроде Spring, это, вероятно, будет чем-то вроде beans-объектов.

Технически, большинство решений «запроса объема» используют ThreadLocal под капотом. MDC также использует ThreadLocal.

Если бы мне пришлось реорганизовать что-то подобное, я попытался бы двигаться в направлении некоторого контейнера для инъекций зависимостей, который уважает разные области применения (запрос, сеанс, приложение и т. Д.), Будь то Spring или что-то еще. Если вы просто замените MDC своим собственным хранилищем на базе ThreadLocal, вы не выиграете много.

+0

это просто мешает мне, почему MDC используется для хранения. Каждый бит данных помещается и считывается из MDC по всему месту. – DarthVader