我有一堆组件需要在每个匹配的生命周期范围内解析(InstancePerMatchingLifetimeScope)。
然而,我必须逐一为它们中的每一个指定它。
e.g。)
builder.RegisterType<LukeSkywalker>().As<IJedi>().InstancePerMatchingLifetimeScope("starwars");
builder.RegisterType<ObiwanKenobi>().As<IJedi>().InstancePerMatchingLifetimeScope("starwars");
builder.RegisterType<MasterYoda>().As<IJedi>().InstancePerMatchingLifetimeScope("starwars");
...
你得到了照片。有没有办法指定&#34;所有这些&#34;是InstancePerMatchingLifetimeScope?
像(伪代码):
[
builder.RegisterType<LukeSkywalker>().As<IJedi>(),
builder.RegisterType<ObiwanKenobi>().As<IJedi>(),
builder.RegisterType<MasterYoda>().As<IJedi>(),
].InstancePerMatchingLifetimeScope("starwars");
答案 0 :(得分:0)
builder.RegisterType<LukeSkywalker>().As<IJedi>()
返回IRegistrationBuilder<out TLimit, out TActivatorData, out TRegistrationStyle>
类型的对象,以便您可以为此类型创建自己的方法。
public static class RegistrationsExtensions
{
public static IRegistrationBuilder<TLimit, TActivatorData, TStyle> InstancePerStarwars<TLimit, TActivatorData, TStyle>(this IRegistrationBuilder<TLimit, TActivatorData, TStyle> registration)
{
return registration.InstancePerMatchingLifetimeScope("starwars");
}
}
并称之为:
builder.RegisterType<LukeSkywalker>().As<IJedi>().InstancePerStarwars()
您还可以创建另一种扩展ContainerBuilder
的方法:
public static void InstancePerStarwars<TLimit, TActivatorData, TStyle>(this ContainerBuilder builder, params IRegistrationBuilder<TLimit, TActivatorData, TStyle>[] registrations)
{
foreach (IRegistrationBuilder<TLimit, TActivatorData, TStyle> registration in registrations)
{
registration.InstancePerStarwars();
}
}
然后,您将能够这样做:
builder.InstancePerStarwars(
new IRegistrationBuilder<Object, ReflectionActivatorData, SingleRegistrationStyle>[] {
builder.RegisterType<LukeSkywalker>().As<IJedi>(),
builder.RegisterType<ObiwanKenobi>().As<IJedi>(),
builder.RegisterType<MasterYoda>().As<IJedi>()
});