c# - 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
解决方案
下面的代码根据您的要求工作。唯一的策略是您的类型将被实例化两次。为了克服这个问题,我进行了两次注册。请看一看,让我们知道。
//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");
}
};
}
});
推荐阅读
- python - 遍历字符串列表并替换某些字符
- java - 匿名内部类的 ClassName 相同 - obj.getClass().getName()
- python - 张量流中通过 3D 张量乘法得到的 3D 张量的形状是什么?
- python - html decode('utf-8') csv 双行 (python 3)
- yii2 - Yii 2 GridView 在 ActiveForm 中搜索
- android - 删除按钮在另一个布局中,如何从另一个布局中调用它
- wordpress - 正确查询 wordpress 类别的附加帖子
- javascript - 在循环内使用函数是否正确
- laravel - 您的要求无法解决为一组可安装的软件包。- laravel 护照
- file - 找不到可执行路径