1 回答
TA贡献1887条经验 获得超5个赞
问题是,这InstancePerOwned<T>实际上只是 的一个特殊情况InstancePerMatchingLifetimeScope(params object[] lifetimeScopeTag),其中范围被标记为typeof(T). 就目前情况而言,在尝试解析时,此处提供的标记与附加到范围的标记之间需要存在直接链接,该链接始终设置为该特定Owned<>依赖项内的任何内容的类型。此时没有额外的逻辑来暗示类型之间的关系,它只是标签上的直接匹配。
但是,InstancePerMatchingLifetimeScope确实允许指定多个标签,因此可以执行以下操作:
builder.RegisterType<BarChannel>()
.InstancePerMatchingLifetimeScope(new TypedService(typeof(FooCall)),new TypedService(typeof(AnotherUnitOfWork)));
为了更简洁地包装它,您可以使用:
private static IEnumerable<Type> GetTypesImplementingInterface<TInterface>()
{
return AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(s => s.GetTypes())
.Where(p => typeof(TInterface).IsAssignableFrom(p));
}
然后是一个新的扩展方法:
public static class AutofacRegistrationBuilderExtensions
{
public static IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> InstancePerOwned<TLimit, TActivatorData, TRegistrationStyle>(
this IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> builder, IEnumerable<Type> serviceTypes)
{
return builder.InstancePerMatchingLifetimeScope(serviceTypes.Select(s => new TypedService(s)).ToArray());
}
}
那么用法就是:
builder.RegisterType<BarChannel>().InstancePerOwned(GetTypesImplementingInterface<IUnitOfWork>());
我不确定最后一部分是否值得纳入 Autofac 本身,但我想如果值得,那么最好将上面的两种方法组合在一起,并从现有注册中检索适用的类型列表,例如类似的内容
InstancePerOwnedImplementing<TInterface>();
或者,扩展匹配范围逻辑以在解析时检查类型之间的关系可能会有点混乱,因为并非所有标签都是 Type 类型。
- 1 回答
- 0 关注
- 126 浏览
添加回答
举报