【问题标题】:autofac's Func<T> to resolve named serviceautofac 的 Func<T> 来解析命名服务
【发布时间】:2010-05-22 15:17:47
【问题描述】:

给定注册服务:

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

我可以通过注入Func&lt;string, IFoo&gt; 之类的东西来检索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&lt;&gt; 做到这一点,但我不想使用它。

【问题讨论】:

    标签: c# .net dependency-injection ioc-container autofac


    【解决方案1】:

    您可以像这样注册自己的解析委托:

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

    【讨论】:

    • 小修改 - 'c' 参数是临时的;如果你想像这样挂在它上面,你需要解析 IComponentContext 。 c => { var cc = c.Resolve();返回命名 => cc.Resolve(命名); }
    • 同意 - 我想找到一种方法让这个更容易捕捉。
    • 你为什么要解析 IComponentContext ?参数 c 已经是 IComponentContext。你可以像这样使用它:builder.Register>(c => named => c.Resolve(named));
    • @user137348 - 正如 Nicholas 提到的,“c”上下文是一个临时上下文实例。如果您在 lambda 中“存储”该上下文,我们正在注册的 lambda 将无法按预期工作。通过解析“IComponentContext”,我们将获得一个可以传递的“真实”上下文。
    • 还是一个错字,应该是 c => { var cc = c.Resolve();返回命名 => cc.ResolveNamed(named); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多