autofac的Func <T>来解析命名服务

ppi*_*icz 13 .net c# dependency-injection ioc-container autofac

鉴于注册服务:

builder.RegisterType<Foo1>().Named<IFoo>("one").As<IFoo>();
builder.RegisterType<Foo2>().Named<IFoo>("two").As<IFoo>();
builder.RegisterType<Foo3>().Named<IFoo>("three").As<IFoo>();
Run Code Online (Sandbox Code Playgroud)

我可以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);
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到Meta<>,但我不想使用它.

Pet*_*old 27

您可以像这样注册自己的解析代表:

builder.Register<Func<string, IFoo>>(c =>
    {
        var cc = c.Resolve<IComponentContext>();
        return named => cc.ResolveNamed<IFoo>(named);
    });
Run Code Online (Sandbox Code Playgroud)

  • 次要编辑 - 'c'参数是临时的; 如果你想像这样挂起它,你需要解决IComponentContext.c => {var cc = c.Resolve <IComponentContext>(); return named => cc.Resolve <IFoo>(named); } (3认同)
  • @ user137348 - 正如Nicholas所提到的,'c'上下文是一个临时的上下文实例.如果你在lambda中"存储"那个上下文,我们正在注册lambda将不会按预期工作.通过解析'IComponentContext',我们将得到一个可以传递的"真实"上下文. (2认同)