Autofac Func‹T› для разрешения именованной службы

Учитывая зарегистрированные услуги:

builder.RegisterType<Foo1>().Named<IFoo>("one").As<IFoo>();
builder.RegisterType<Foo2>().Named<IFoo>("two").As<IFoo>();
builder.RegisterType<Foo3>().Named<IFoo>("three").As<IFoo>();

Могу ли я получить именованные реализации интерфейса IFoo, внедрив что-то вроде Func<string, IFoo>?

public class SomeClass(Func<string, IFoo> foo) {
    var f = foo("one");
    Debug.Assert(f is Foo1);

    var g = foo("two");
    Debug.Assert(g is Foo2);

    var h = foo("three");
    Debug.Assert(h is Foo3);
}

Я знаю, что могу сделать это с помощью Meta<>, но я не хочу его использовать.


person ppiotrowicz    schedule 22.05.2010    source источник


Ответы (1)


Вы можете зарегистрировать свой собственный разрешающий делегат следующим образом:

builder.Register<Func<string, IFoo>>(c =>
    {
        var cc = c.Resolve<IComponentContext>();
        return named => cc.ResolveNamed<IFoo>(named);
    });
person Peter Lillevold    schedule 22.05.2010
comment
Незначительное редактирование - параметр 'c' является временным; вам нужно разрешить IComponentContext, если вы хотите повесить его вот так. c =› { var cc = c.Resolve‹IComponentContext›(); return named =› cc.Resolve‹IFoo›(named); } - person Nicholas Blumhardt; 29.05.2010
comment
Согласен - я хотел бы найти способ, чтобы это было легче поймать. - person Nicholas Blumhardt; 31.05.2010
comment
Почему вы разрешаете IComponentContext ? Параметр c уже является IComponentContext. Вы можете использовать его следующим образом: builder.Register‹Func‹string, object››(c =› named =› c.Resolve‹object›(named)); - person user137348; 02.10.2010
comment
@ user137348 - как упоминает Николас, контекст «c» является временным экземпляром контекста. Если вы сохраните этот контекст в лямбде, которую мы регистрируем, лямбда не будет работать должным образом. Разрешив 'IComponentContext', мы получим реальный контекст, который можно передавать. - person Peter Lillevold; 04.10.2010
comment
Еще одна опечатка, должно быть c =› { var cc = c.Resolve‹IComponentContext›(); return named =› cc.ResolveNamed‹IFoo›(named); } - person Alexey Zimarev; 04.12.2012
comment
@AlexeyZimarev - вы правы, не знаю, почему я изменил это на объект :| - person Peter Lillevold; 04.12.2012
comment
@PeterLillevold спасибо. ты прав. удалил комментарий, чтобы избежать путаницы. - person JJS; 31.07.2016
comment
@JJS - все хорошо. Тогда я тоже удалю свои комментарии по этому поводу :) - person Peter Lillevold; 01.08.2016