在相同的匹配生命周期范围内注册多个组件

时间:2015-11-16 22:15:19

标签: c# autofac

我有一堆组件需要在每个匹配的生命周期范围内解析(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");

1 个答案:

答案 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>()
    });