首页 > 解决方案 > Autofac:在解析时创建命名范围

问题描述

Autofac 是否可以在每次解析另一种特定类型时自动实例化类型并为特定类型创建命名范围?

例如

builder.Register<MyType>.As<IMyType>().InstancePerLifetimeScope();
builder.RegisterAsAutoInstantiateType<IMyType, MySubType>().As<IMySubType>();

class MySubType(IMyType myType)
{
    ...
}

我已经尝试过使用 Owned、OnActivated 和IEnumerable<IMySubType>每次解析时的IMyType解析,但我想要的是为每个解析创建一个新的生命周期范围,并自动解析并实例化为该范围IMyType注册的所有类型 。IMyType

标签: c#.netautofac

解决方案


下面的代码根据您的要求工作。唯一的策略是您的类型将被实例化两次。为了克服这个问题,我进行了两次注册。请看一看,让我们知道。

        //Lighweight registration
        containerBuilder.RegisterType<TestItem>().As<ITestItem>();


        //Actual regirstation
        containerBuilder.Register((c, qe) =>
        {
            var subType = c.Resolve<IsubType>();
            return new TestItem(subType);

        }).As<ITestItem>().Keyed("TestKey", typeof(ITestItem));


        containerBuilder.RegisterBuildCallback(builtContainer =>
        {
            //Filter for types
            foreach (var registration in builtContainer.ComponentRegistry.Registrations)
            {
                registration.Activating += (sender, eventArgs) =>
                 {
                     var instanseLookup = eventArgs.Context as IInstanceLookup;
                     if (instanseLookup != null && !instanseLookup.ActivationScope.Tag.Equals("Manual"))
                     {
                         var scope = builtContainer.BeginLifetimeScope("Manual");
                         eventArgs.Instance = scope.ResolveKeyed<ITestItem>("TestKey");
                     }


                 };
            }
        });

推荐阅读