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