2014-12-10 2 views
0

В следующем коде показан поток, который я пытаюсь реализовать в службе WCF. Служба при запуске вызывает класс Bootstrapper, который использует Unity для регистрации и разрешения требуемых типов. Класс Gateway содержит общедоступный метод, который затем запускает основной поток обработки сообщения (для кода имеется намного больше уровней, чем показано ниже).Передача уникального значения для всех классов с использованием инъекции зависимостей?

public static class Bootstrapper 
{ 
    public static IGateway InitializeGateway() 
    { 

     IUnityContainer resolver = new UnityContainer(); 

     resolver.RegisterType<IGateway, Gateway>(); 
     resolver.RegisterType<ITranslator, Translator>(); 
     resolver.RegisterType<IFormatter, IFormatter>(); 

     return resolver.Resolve<IGateway>(); 
    }  

} 

public class Gateway : IGateway 
{ 

    private readonly ITranslator translator; 
    private readonly IFormatter formatter; 

    public Gateway(ITranslator translator, IFormatter formatter) 
    { 
     this.translator = translator; 
     this.formatter = formatter; 
    } 

    public string ProcessMessage(string requestMessage) 
    { 
     // Create a new GUID for use in main flow for logging 
     Guid messageGuid = Guid.NewGuid(); 

     requestMessage = this.translator.TranslateMessage(requestMessage); 

     requestMessage = this.formatter.FormatMessage(requestMessage); 

     return requestMessage; 
    } 
} 

Теперь то, что я пытаюсь достичь взять GUID (созданный для каждого сообщения) и передать это вниз в потоке службы таким образом, что каждый класс имеет ссылку на него для целей регистрации.

Я попытался найти способ использования DI и инсталляции конструктора, но не знаю, можно ли это сделать, поскольку GUID создается при получении сообщения шлюзом (после вызова начальной загрузки). То, что я пытаюсь уйти, это передать GUID в каждый метод в качестве параметра.

Любые предложения?

+0

Насколько я вижу, вы только один раз разрешаете свой шлюз, а затем используете этот шлюз для обработки нескольких сообщений? Если это так, то я не вижу, как DI через ваш контейнер IoC может помочь. Это работа выполняется к моменту начала приема сообщений. Вы используете GUID, чтобы действовать как идентификатор для каждого сообщения. Почему вы не можете инкапсулировать строку GUID и requestMessage в класс Message? Таким образом, любой метод, получающий сообщение, получит доступ к его идентификатору. – olitee

ответ

0

Вместо того чтобы опрокинуть ваше собственное решение этой проблемы с помощью DI, я бы рекомендовал использовать для этой цели статическое свойство Trace.CorrelationManager.ActivityId.

Взгляните на эту статью на WCF End-To-End Tracing.

Смежные вопросы