1 回答

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個贊
問題是,這InstancePerOwned<T>實(shí)際上只是 的一個特殊情況InstancePerMatchingLifetimeScope(params object[] lifetimeScopeTag),其中范圍被標(biāo)記為typeof(T). 就目前情況而言,在嘗試解析時,此處提供的標(biāo)記與附加到范圍的標(biāo)記之間需要存在直接鏈接,該鏈接始終設(shè)置為該特定Owned<>依賴項(xiàng)內(nèi)的任何內(nèi)容的類型。此時沒有額外的邏輯來暗示類型之間的關(guān)系,它只是標(biāo)簽上的直接匹配。
但是,InstancePerMatchingLifetimeScope確實(shí)允許指定多個標(biāo)簽,因此可以執(zhí)行以下操作:
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));
}
然后是一個新的擴(kuò)展方法:
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 本身,但我想如果值得,那么最好將上面的兩種方法組合在一起,并從現(xiàn)有注冊中檢索適用的類型列表,例如類似的內(nèi)容
InstancePerOwnedImplementing<TInterface>();
或者,擴(kuò)展匹配范圍邏輯以在解析時檢查類型之間的關(guān)系可能會有點(diǎn)混亂,因?yàn)椴⒎撬袠?biāo)簽都是 Type 類型。
- 1 回答
- 0 關(guān)注
- 145 瀏覽
添加回答
舉報