2015-12-29 2 views
0

У меня есть своеобразная проблема с 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.

У кого-нибудь есть идеи, почему?

ответ

1

Вы создаете экземпляр PersistedObject перед вызовом CallContext.LogicalSetData

Container c = new Container(map => 
{ 
    map.For<PersistedObject>().Use(new PersistedObject()); // <-- This is calling the ctor. 
}); 

CallContext.LogicalSetData("myvar", "Logical call context variable"); 

Если изменить код выше

Container c = new Container(map => 
{ 
    map.For<PersistedObject>().Use<PersistedObject>(); // <-- No ctor call 
}); 

CallContext.LogicalSetData("myvar", "Logical call context variable"); 

Вы должны получить правильный вывод.

+0

Спасибо за ваш ответ - я вижу теперь очевидное :). Однако я также понял, что мой пример был фактически неправильным - то, с чем я действительно сталкиваюсь, немного отличается - для меня я создал новый вопрос: http : //stackoverflow.com/questions/34520156/logical-call-context-not-propagated-across-threads –

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