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 關注
- 148 瀏覽
添加回答
舉報