У меня есть своеобразная проблема с StructureMap.Контексты StructureMap и логического вызова
Всякий раз, когда я построить объект, который создается новый поток, контекст логического вызова (System.Runtime.Remoting.Messaging.CallContext
) становится пустым:
class Program
{
static void Main(string[] args)
{
Container c = new Container(map =>
{
map.For<PersistedObject>().Use(new PersistedObject());
});
CallContext.LogicalSetData("myvar", "Logical call context variable");
Console.WriteLine($"Main: {Thread.CurrentThread.ManagedThreadId}: {CallContext.LogicalGetData("myvar")}");
var obj = c.GetInstance<PersistedObject>();
obj.Print("IoC");
Console.WriteLine("--------------------");
new PersistedObject().Print("Constructed");
Console.ReadLine();
}
public class PersistedObject
{
public PersistedObject()
{
Console.WriteLine($"Ctor: {Thread.CurrentThread.ManagedThreadId}: {CallContext.LogicalGetData("myvar")}");
Thread t = new Thread(() => Print("Thread"));
t.Start();
}
public void Print(string message)
{
Console.WriteLine($"{message}: {Thread.CurrentThread.ManagedThreadId}: {CallContext.LogicalGetData("myvar")}");
}
}
}
Приведенный выше код дает следующие результаты:
Main: 10: Logical call context variable
Ctor: 10: <Null>
Thread: 11: <Null>
IoC: 10: Logical call context variable
--------------
Ctor: 10: Logical call context variable
Constructed: 10: Logical call context variable
Thread: 12: Logical call context variable
Как вы можете см., когда к контексту логического вызова обращается в конструкторе (или потоке, который порождается в конструкторе), он не работает с StructureMap.
У кого-нибудь есть идеи, почему?
Спасибо за ваш ответ - я вижу теперь очевидное :). Однако я также понял, что мой пример был фактически неправильным - то, с чем я действительно сталкиваюсь, немного отличается - для меня я создал новый вопрос: http : //stackoverflow.com/questions/34520156/logical-call-context-not-propagated-across-threads –