【问题标题】:Identify the dependency resolving an instance - IoC (autofac)识别解析实例的依赖项 - IoC (autofac)
【发布时间】:2015-02-21 11:14:20
【问题描述】:

有没有办法确定哪个调用者/依赖项正在解析它所依赖的实例?这就是我的想法

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 Web 应用程序的上下文中运行

【问题讨论】:

  • 你为什么要这样做?
  • 说用于记录目的..

标签: c# asp.net-mvc dependency-injection autofac


【解决方案1】:

您可以使用ResolveOperationBeggingInstanceLookupBeginning 事件

    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

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多