Черт возьми, я ненавижу отвечать на свой вопрос, но все предложенные альтернативы казались не по теме или слишком сложными.Комментарий Ника оказался наиболее близким к интересному, но только полностью отпугнул меня от внутренних органов Autofac;).Я исследовал, но это было излишним для моей ситуации.
Я закончил тем, что разделил разницу (как подразумевается в моем комментарии выше), отказался от свободного интерфейса, но все же допускал гибкое продолжение регистрации, принимая конфигурациюв самом методе:
public static void RegisterSharedChannel<T>(this ContainerBuilder builder, Func<IComponentContext, ChannelFactory<T>> @delegate,
Action<Autofac.Builder.IRegistrationBuilder<object, Autofac.Builder.IConcreteActivatorData, Autofac.Builder.SingleRegistrationStyle>> config)
{
builder.Register(c => c.Resolve<Wcf.ISharedChannel<T>>().GetChannel()).ExternallyOwned();
//would be really nice to be able to retain the fluency of the interface, but: /4451375/svobodnaya-konfiguratsiya-neskolkih-registratsii
//this should suffice for now...
var facreg = builder.Register(c => @delegate(c));
var sharereg = builder.RegisterType<Wcf.SharedChannel<T>>().AsImplementedInterfaces();
config(facreg);
config(sharereg);
}
Синтаксис вызова не так хорош (например:
builder.RegisterSharedChannel(c => BuildChannelFactory(...), r => r.SingleInstance());
, но все (большая часть?) гибкости все еще там.