gpt4 book ai didi

c# - Autofac 解析具有不同参数的同一类实例

转载 作者:行者123 更新时间:2023-12-02 03:42:12 28 4
gpt4 key购买 nike

我有一个 Xamarin.Forms 应用程序,我在其中使用 Autofac 进行 DI。

所以我想要的很简单,但我无法做一些看起来很困难的事情。

所以我有一个类,它有两个构造函数,它们都有一个参数,并且根据某些条件我想解析其中一个。举个例子,我有一个类 A,我想要的是基于条件 B 或 C 应该得到解决。

例如:

public class A
{

public A(B bObject)
{...}

public A(C cObject)
{...}
}

但我无法理解如何做到这一点。我尝试做如下的事情:

注册:

 builder.RegisterType<A>().
UsingConstructor(typeof(C)).
Named<A>(nameof(C));

builder.RegisterType<A>().
UsingConstructor(typeof(B)).
Named<A>(nameof(B));

解决:

DiContainer.ResolveNamed<A>(nameof(B));
DiContainer.ResolveNamed<A>(nameof(C));

注意:我已经在容器中注册了B和C,如下所示:

builder.RegisterType<B>();
builder.RegisterType<C>()

我对 AutoFac 有点陌生,我什至不确定这是否是正确的方法,我认为这与我注册两次有关,我不确定。

强烈感谢任何建议或帮助。

最佳答案

您可以尝试使用 Autofac lambda registration为此,并使用以下代码片段执行注册(c 这里的参数是 IComponentContext 实例)

var builder = new ContainerBuilder();
builder.Register(
(c, p) =>
{
var condition = p.Named<bool>("condition");
return condition ? new A(c.Resolve<B>()) : new A(c.Resolve<C>());
});
builder.RegisterType<B>();
builder.RegisterType<C>();

然后解析A通过 passing lambda 表达式的参数。您可以使用TypedParameter而不是命名(仅限常量值)或 ResolvedParameter (动态值)

var a = container.Resolve<A>(new NamedParameter("condition", true));

如果您不想显式调用Resolve ,你可以看看 delegate factories (Func<T> 例如)

关于c# - Autofac 解析具有不同参数的同一类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58801652/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com