2015-02-21 2 views
1

Есть ли способ определить, какой вызывающий/зависимый объект разрешает экземпляр, от которого он зависит? вот что я имею в видуОпределить зависимость, разрешающую экземпляр - IoC (autofac)

public class A 
{ 
    public A() 
    { 
     Console.Write("I am being resolved by {0}"); 
    } 
} 

public class B 
{  
    public B(A a) 
    { 
     //Should print: A being resolved by B 
    } 
} 


public class C 
{ 
    public C(A a) 
    { 
    //Should print: A being resolved by C 
    } 
} 

Я угадывание для одного экземпляра, который разделен между несколькими зависимости может быть немного сложнее, но я специально искал случаев решенных в зависимости Таким образом, в приведенном выше примере будет два экземпляра B.

FWIW, мой IoC контейнер Autofac и он работает в контексте веб-приложения MVC

+0

Почему вы хотите это сделать? –

+0

говорят для ведения журнала. – Baz1nga

ответ

5

Вы можете использовать ResolveOperationBegging и InstanceLookupBeginning событий

ContainerBuilder builder = new Autofac.ContainerBuilder(); 
    builder.RegisterType<A>().AsSelf(); 
    builder.RegisterType<B>().AsSelf(); 
    builder.RegisterType<C>().AsSelf(); 

    IContainer container = builder.Build(); 

    EventHandler<LifetimeScopeBeginningEventArgs> lifetimeScopeBeginning = null; 
    lifetimeScopeBeginning = (sender, e) => 
    { 
     e.LifetimeScope.ResolveOperationBeginning += (sender2, e2) => 
     { 
      List<IInstanceActivator> activators = new List<IInstanceActivator>(); 
      e2.ResolveOperation.InstanceLookupBeginning += (sender3, e3) => 
      { 
       activators.Add(e3.InstanceLookup.ComponentRegistration.Activator); 
       Console.WriteLine("Activation Path : {0}", String.Join(" => ", activators.Select(a => a.LimitType.Name).ToArray())); 
      }; 
     }; 
     e.LifetimeScope.ChildLifetimeScopeBeginning += lifetimeScopeBeginning; 
    }; 
    container.ChildLifetimeScopeBeginning += lifetimeScopeBeginning; 

    using (ILifetimeScope scope = container.BeginLifetimeScope()) 
    { 
     scope.Resolve<C>(); 
    } 

Этот код будет отображать

Activation Path : C 
Activation Path : C => B 
Activation Path : C => B => A 
Смежные вопросы